[英]Vectorizing a summation in Matlab
我正在研究凸優化問題,我想計算以下總和:
請注意,我對矢量使用了粗體符號,對數字使用了純字體。 我用這個函數計算這個表達式:
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(...)
例如矩陣乘法和sum(...)
來表達它sum(...)
。
編輯
我已經嘗試了以下方法,但是不幸的是我沒有得到相同的結果:
grad_f_x = ((1/(b - A*x))*A).';
可能微不足道,但請注意.'
運算符是轉置運算符,為了確保我不會弄復雜的數字(可能沒有必要),我使用了句號。
嘗試
grad_f_x=A.'*(1./(b-A*x));
在這里, A*x
是大小為(mxn)*(nx 1) -> (mx 1)
的矩陣乘法,即它是列向量,每行告訴您dot(a_i,x)
。 您可以從同樣的m
長度列向量b
減去它。 使用1./(bA*x)
我們執行逐元素的倒數,因此該對象仍然是m
長度的列向量。 然后將其與A
的轉置矩陣相乘,大小為(nxm)*(mx 1) -> (nx 1)
,它是列向量,與x
大小相同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.