-1
for i = 1:N 
    for j = 1:M 
     for c = 1:3 
      A(:,:,c,i) = A(:,:,c,i).*B(:,:,j); 
     end 
    end 
end 

是否有可能通過向量化消除最內層的循環,例如?如何加速這個數組乘法?

+3

你的代碼是否正確? 'j'循環無用,只有值'j = M'存活。用你的代碼,你可以刪除第二個循環,並設置'j = M;' –

+0

哦,'j'循環沒問題,變量名稱不正確,現在我修復了它,謝謝。 –

+0

同樣的問題。只有'j = M'真的被使用! 'j'的其他值的結果是_overwritten_ –

回答

1

首先,你可以通過左乘矩陣消除了j中的循環:

B2 = prod(B, 3); % Element-wise product along third dim 

for i = 1:N 
    for c = 1:3 
     A(:,:,c,i) = A(:,:,c,i) .* B2; 
    end 
end 

然後你可以使用repmat平鋪矩陣B2出來,消除其他兩個環。我有一些困難,包裹我的周圍4D-Matricies頭,但它應該是這樣的:

B2 = prod(B, 3); % Element-wise product along third dim 
B3 = repmat(B2, [1 1 3 N]); 
A = A .* B3; 

或(甚至更好)使用bsxfun:

B2 = prod(B, 3); % Element-wise product along third dim 
A = bsxfun(@times, A, B2); 

bsxfun將使用較少的內存,因爲它「幾乎複製「B2。

+0

那麼,這是不一樣的,如果'B2'在'i'循環中並且看起來像這樣'B2 = prod(B(:,: i-1),3);'這應該加快程序,謝謝你,但現在我該如何使用repmat? –

+0

@ĬnfernalSeraphím:除了浮點精度錯誤,輸出也是一樣的。在數學層面上,代碼完全一樣。 – Daniel

+3

我會用'A = bsxfun(@ times,A,B2);'而不是'repmat' – Daniel