Matlab中求和的矢量化

Matlab中求和的矢量化,matlab,loops,optimization,sum,Matlab,Loops,Optimization,Sum,我正在研究一个凸优化问题,我想计算以下总和: 请注意,我用粗体表示向量,用普通字体表示数字。我用这个函数计算这个表达式: 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的维数越来越大时,这个循环将非常昂贵,我正试

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

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

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提供的函数和运算符来表示它,如矩阵乘法和求和(…)

编辑

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

grad_f_x = ((1/(b - A*x))*A).';
这可能很简单,但请注意,
运算符是转置运算符,我使用句点是为了确保不会弄乱复数(可能没有必要)。

试试看

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

在这里,
A*x
是一个大小为
(mxn)*(nx1)->(mx1)
的矩阵乘法,即它是一个列向量,每一行告诉你
点(A_i,x)
。您可以从长度相同的
m
列向量
b
中减去该值。使用
1./(b-A*x)
我们执行元素的倒数,所以这个对象仍然是
m
长度的列向量。然后将其与
A
的转置矩阵相乘,大小为
(nxm)*(mx1)->(nx1)
,这是一个列向量,大小与
x

相同。我不确定您是否可以在不循环的情况下编写列向量和行向量乘法1。对R^n:)2使用
\mathbb{}
而不是
\mathfrak{}
。我添加了一个答案,但是我注意到了你的编辑。你几乎说对了:你需要1/(…)`来得到一个元素级除法。正确地使用
而不是
是一种很好的做法。我不知道为什么,但如果我使用
/
而不是
/
的话,Matlab会抱怨其中一个矩阵乘法(我不确定是哪一个),即矩阵尺寸不一致。@koursaros你是对的:我原来的是
(m x 1)*(m x n)
,这不起作用。我将其重新排序为
(nxm)*(m1)=(nx1)
,请查看:)