2016-08-01 27 views
-1

使用用於循環我有一個矢量X = [X_1 X_2 ... x_n],矢量Ŷ = [Y_1 Y_2 Y_3]和基質X = [x_11 x_12 ... x_1n; x_21 x_22 ... x_2n; x_31 x_32 ... x_3n]。嘗試,來計算特定求和方程而不在MATLAB

對於i = 1, 2, ..., n,我想計算的MATLAB以下sum

sum((x(i) - y*X(:,i))^2) 

我試圖寫的是下面的MATLAB代碼:

vv = (x(1) - y*X(:,1))^2; % as an initialization for i=1 
for i = 2 : n 
vv = vv + (x(i) - y * X(:,i))^2 
end 

但如果我能我想知道計算沒有for循環,以便潛在地減少計算時間,尤其是如果n是非常高的...那麼在MATLAB中有沒有其他更加優化的可能性呢?

任何幫助將不勝感激!

+0

您仍然需要訪問數組中的每個元素。這不能改變。你可以並行化它,因爲這個流可以分成不同的塊,但是這個好處是有限制的。你無法比每個可用內核的一個線程做得更好。如果你使用GPU,這可能是一個很高的數字,但它仍然是有限的。 – duffymo

+0

您的循環與您的公式不同。你想總結每個差異的平方,或平方整體的總和? – beaker

+0

沒有每個區別的差異:) – Christina

回答

1

你不需要循環可言,

for i = 2:n 
    y*X(:,i) 
end 

是一樣的只是y*X,所以X(I) - ŸX(:我)只是說明X - Y X所以基本上,其:

vv = sum((x - y * X).^2); 

感謝@beaker指出錯誤。

+0

我不認爲你需要'cumsum',只是'sum(x - y * X)^ 2' – beaker

+0

(或'(sum(x - y * X))^2'取決於OP實際需要什麼) – beaker

+0

'vv'看起來像一個累加器給我。它最終應該是一個標量,而不是一個矢量。 – beaker