【问题标题】:Vectorizing a summation in Matlab在 Matlab 中向量化求和
【发布时间】:2016-02-24 03:11:46
【问题描述】:

我正在研究一个凸优化问题,我想计算以下总和:

请注意,我使用粗体表示矢量,使用普通字体表示数字。我用这个函数计算这个表达式:

function [grad_f_x] = gradient1(b, A, x, n, m)

grad_f_x = zeros(n, 1);

for i = 1:m
   grad_f_x = grad_f_x + 1/(b(i) - A(i, :)*x)*A(i, :).';
end 

end

但是,我担心当优化问题 n 的维度越来越大时,这个循环会非常昂贵,我正试图找到一种方法来使用 Matlab 提供的函数和运算符来表达它,比如矩阵乘法和sum(...)

编辑

我尝试了以下方法,但不幸的是我没有得到相同的结果:

grad_f_x = ((1/(b - A*x))*A).';

这可能是微不足道的,但请注意 .' 运算符是转置运算符,我使用句号是为了确保我不会弄乱复数(这可能是不必要的)。

【问题讨论】:

  • 我不确定你是否可以在不循环的情况下编写列和行向量乘法
  • 1.使用\mathbb{} 而不是\mathfrak{} 代表R^n :) 2. 我添加了一个答案,但随后我注意到了您的编辑。你几乎做对了:你需要 1./(...)` 来获得一个元素除法。正确使用.' 而不是' 是非常好的做法。

标签: matlab loops optimization sum


【解决方案1】:

试试

grad_f_x=A.'*(1./(b-A*x));

这里A*x 是一个矩阵乘法,大小为(m x n)*(n x 1) -> (m x 1),即它是一个列向量,每一行都告诉你dot(a_i,x)。您可以从同样的m-length 列向量b 中减去它。使用1./(b-A*x),我们执行一个元素倒数,所以这个对象仍然是一个m-length 列向量。然后矩阵乘以A的转置,大小为(n x m)*(m x 1) -> (n x 1),这是一个列向量,大小与x相同。

【讨论】:

  • 我不知道为什么,但是如果我使用./ 而不是/ Matlab 会抱怨其中一种矩阵乘法(我不确定是哪一种),即矩阵尺寸不一致。
  • @koursaros 你是对的:我的原件是(m x 1)*(m x n),这不起作用。我重新订购了(n x m)*(m x 1)=(n x 1),请查看:)
猜你喜欢
  • 1970-01-01
  • 2016-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多