2013-06-18 58 views
4

我需要評估下面的表達式(僞算術符號):如何向量化正常和點的陣列之間的點積之和

ipin

其中p是一個矩陣的三元向量和n是三元向量。我可以用for循環做如下,但我無法弄清楚如何 矢量化這樣的:

p = [1 1 1; 2 2 2]; 
n = [3 3 3]; 
s = 0; 
for i = 1:size(p, 1) 
    s = s + dot(p(i, :), n) 
end 
+0

matlab有'+ ='運算符嗎?你使用什麼版本? – Shai

+0

@Shai顯然這個示例代碼還沒有經過測試。 for循環也被不小心編寫了。我已經解決了他們兩個。 –

+0

@EitanT我正在研究一箇舊的matlab版本,我有點希望他們實現'+ ='...太糟糕了。 – Shai

回答

5

爲什麼複雜的事情?如何簡單的矩陣乘法:

s = sum(p * n(:)) 

其中p被假定爲中號逐3矩陣。

+0

+1這裏沒有使用'bsxfun' – Shai

+0

這個答案會授予你matlab金徽章!恭喜! – Shai

+0

@Shai謝謝! :) –

0

我認爲你可以bsxfun做到這一點:

sum(sum(bsxfun(@times,p,n))) 
+0

'bsxfun'很有趣,但是在這個特定的解決方案中,它沒有到位:(...這個'bsxfun'沒有+1。 – Shai

+1

@Shai你已經提到'bsxfun'這麼多次,只要你現在提到它,你就用押韻說話;) –

0
---------- 


% Is it the same for this case? 


---------- 


n = 200;     % depending on the computer it might be 

m = 1000*n;    % that n needs to be chosen differently 

A = randn(n,m); 

x = randn(n,1); 

p = zeros(m,1); 

q = zeros(1,m); 
tic; 

for i = 1:m 

    p(i) = sum(x.*A(:,i)); 
    q(i) = sum(x.*A(:,i)); 
end 
time = toc; disp(['time = ',num2str(time)]); 
+0

找到(以及)不需要的解決方案以轉置A.當然,請提供您用於矢量化的命令。 – pietervs