2013-11-21 30 views
0

我必須將數組元素AB乘以元素並計算第一維的總和,然後返回結果CAN -by- M-by-L矩陣。 BN-012--由L矩陣。 NM低於30,但是L非常大。我的代碼是:如何使這個循環在matlab中更快

C=zeros(size(B)); 
parfor i=1:size(A,2) 
    C(i,1,:) = sum(bsxfun(@times, A(:,i,:), B(:,1,:)), 1); 
end 

問題是代碼很慢,任何人都可以幫助使代碼更快?非常感謝你。

回答

0

如何沿着這個線的東西:

C = permute(sum(A.*repmat(B,1,M)),[2,1,3]); 

這加速我的電腦開機後的計算由倍〜4。有趣的是,只需將parfor環路更改爲for環路,實際上可以將計算速度提高2倍(至少在我的PC上)。

+1

它應該是在案件中的元素非共軛轉''.'''是複雜的。 –

+0

實際上,根本不需要轉置,因爲轉置不是爲3D矩陣定義的。 Permute是一個更好的主意,它似乎並沒有給性能帶來任何好處。 – MrAzzaman

0

以路易斯·Mendo的意見,我建議使用這個命令:

C=reshape(sum(bsxfun(@times, A, B), 1), size(B)) 

我認爲這是最快的。

+0

我認爲這與我所建議的幾乎相同,只是不清楚發生了什麼。我相當確信在MATLAB下,bsxfun和元素級乘法完全一樣,而permute/reshape的區別就是分割頭髮。 – MrAzzaman

+1

爲什麼'repmat'? 'bsxfun'自動重複;實際上這就是'bsxfun'的本質 –

0

如果我理解正確的話,只是這樣做:大小爲M

C = squeeze(sum(bsxfun(@times, A, B))); 

這給C X L.