在Matlab中对求和进行矢量化

时间:2015-11-21 18:15:19

标签: matlab loops optimization sum

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

enter image description here

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

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 个答案:

答案 0 :(得分:0)

尝试

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

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