我正在研究凸优化问题,我想计算以下总和:
请注意,我使用粗体表示法来表示向量,使用普通字体表示数字。我用这个函数计算这个表达式:
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).';
这可能很简单,但请注意.'
运算符是转置运算符,我使用句点以确保我不会弄乱复数(可能没必要)。
答案 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
相同。