2014-02-06 44 views
6

我有一個問題,我希望可以輕鬆解決。 A是N矩陣,B是N矩陣。的目標是得到矩陣C如何將矩陣A的每一列乘以矩陣B的每一行,並在Matlab中求和得到的矩陣?

enter image description here

其等於通過B的每行和求和所得的矩陣轉置A的各列相乘;求和之前這樣的矩陣的總數是N N,它們的尺寸爲Gģ 這可以在與MatLab的用於 2 -loops容易實現:

N=5; 
G=10; 
A=rand(N,G); 
B=rand(N,G); 
C=zeros(G); 
for n=1:1:N 
    for m=1:1:N 
     C=C+A(m,:)'*B(n,:); 
    end 
end 

然而,對於大的矩陣它是相當緩慢。

所以,我的問題是: 有沒有一種更有效的方法來計算Matlab中的C矩陣?

謝謝

+0

你試過A'* B? –

+2

對於良好表達,工作問題和自包含代碼 –

+0

@Bibek Subedi對於N = 2; G = 2; A = [1 2; 3 4]; B = [5 6; 7 8];我的代碼返回C = [48 56; 72 84]和A'* B = [26 30; 38 44] A'* B等於單和sum_ {n} A_ {ni} B_ {nk},而不是雙sum_ {m,n} A_ {mi} B_ {nk}我需要 – iVanguard

回答

7

如果你寫這一切了兩個3×3矩陣,你會發現操作基本上等於這樣的:

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

運行的每個問題的答案這裏N=50G=100和重複每一個方法100時間:

Elapsed time is 13.839893 seconds. %// OP's original method 
Elapsed time is 19.773445 seconds. %// Luis' method 
Elapsed time is 0.306447 seconds. %// Robert's method 
Elapsed time is 0.005036 seconds. %// Rody's method 

(最快和最慢的方法之間≈4000的一個因素......)

+0

+1,迄今爲止IMO的最佳答案! –

+0

非常感謝,它的工作 恥辱對我沒有看到它自己) – iVanguard

+0

+1好了! [分配屬性](http://en.wikipedia。org/wiki/Distributive_property)大大減少了這種情況下的操作次數 –

2

使用bsxfun代替循環,然後sum兩次:

C = sum(sum(bsxfun(@times, permute(A, [2 3 1]), permute(B,[3 2 4 1])), 3), 4); 
+1

有時'bsxfun','arrayfun'慢於嵌套for循環... – Adiel

+0

@Adiel至於'arrayfun'我同意。至於'bsxfun',不是很多 –

+0

感謝您的回答,我已經檢查過它,它對於小N和G很好。但是對於G = 1000和N = 100(這比我的實際矩陣還小)我的系統內存不足。 – iVanguard

3

我想這應該提高性能顯著

C = zeros(G); 
for n = 1:N 
    C = C + sum(A,1)'*B(n,:); 
end 

您避免一個循環,也應該避免內存不足的問題。根據我的基準測試,它比使用兩個循環的方法快20倍。 (注意,我必須在Octace中進行基準測試,因爲我沒有在這臺PC上使用MATLAB)。

相關問題