2013-11-01 125 views
3

我有三個矩陣在Matlab中,A是n x m,B是p x m,C是r x n。我可以在Matlab中快速執行以下操作嗎?

假設我們初始化使用一些矩陣:

A = rand(3,4); 
    B = rand(2,3); 
    C = rand(5,4); 

下面的兩個是等效的:

>> s=0; 
>> for i=1:3 
     for j=1:4 
      s = s + A(i,j)*B(:,i)*C(:,j)'; 
     end; 
    end 
>> s 

s = 

2.6823 2.2440 3.5056 2.0856 2.1551 
2.0656 1.7310 2.6550 1.5767 1.6457 


>> B*A*C' 

ans = 

2.6823 2.2440 3.5056 2.0856 2.1551 
2.0656 1.7310 2.6550 1.5767 1.6457 

後者是更有效的。

我無法找到循環的下列變體的任何有效的版本:

s=0; 
for i=1:3 
     for j=1:4 
      x = A(i,j)*B(:,i)*C(:,j)'; 
      s = s + x/sum(sum(x)); 
     end; 
end 

在此,所添加的基質可以通過值的每個步驟之後的總和歸一化。

任何想法如何使這種效率像矩陣乘法以上?我認爲可能accumarray可以幫助,但不知道如何。

回答

3

你可以用bsxfun有效地做到這一點:

aux1 = bsxfun(@times, permute(B,[1 3 2]), permute(C,[3 1 4 2])); 
aux2 = sum(sum(aux1,1),2); 
s = sum(sum(bsxfun(@rdivide, aux1, aux2),3),4); 

需要注意的是,由於標準化的,其結果是獨立的A,假設它不包含任何零個條目(如果這樣做的結果是未定義)。

相關問題