2012-01-10 9 views
2

私はMATLABに2つの行列を持ち、サイズn x mのAとサイズn x mのBも持っています。MATLABで高速外部製品を計算するには?

for i = 1:n 
    C = C + outerProduct(A(i,:), B(i,:)); 
end 

すなわちCサイズmのX mの行列、ABのすべての行外の製品の合計です:私のようなものがある新しい行列Cを作成したいです。 forループなしでそれを行うための速い方法はありますか? Forループは、MATLABでは非常に遅いです。

答えて

3

あなたは(列の外側積の和)実行している操作がBAの転置バージョンの乗算と等価である:

C = A.'*B; 

次の例を使用して、これを見ることができます:

>> mat = magic(5); %# A sample 5-by-5 matrix 
>> A = mat(1:4,:); %# Create a 4-by-5 matrix 
>> B = mat(2:5,:); %# Create another 4-by-5 matrix 

>> C = zeros(5); %# Initialize C to be 5-by-5 
>> for i = 1:4, C = C + A(i,:).'*B(i,:); end; %'# Calculate C as you are now 

>> isequal(C, A.'*B) %'# Test for equality with the shorter solution 

ans = 

    1 %# Equal! 
+0

いいえ、そうではありません。これは、各セルに内製品を使用します。 – kloop

+2

$ C_ {IJ} = \ sum_k A_ {} KI B_ {KJ} = \ sum_k A^T_ {IK} B_ {KJ} = A^T実際に、私はそれが正しいことだと思う$ – Nzbuu

+0

*のB。ありがとう。 – kloop

3

forループコードをプロファイリングしましたが、遅すぎると判断しましたか?そうでない場合は、ループペナルティを苦労させるにはあまりにも多くの時間を費やす前にそれを行います。

あなたのforループは特にループではないので、ループはn回だけですが、それぞれのループではO(n*m)になります。ループのペナルティは厳しいものではありません。本当に悪い状況はネストされたループです。ネストされたforループで外側の製品を計算した場合。

2

はおそらく、私は誤解だが、私は何を探していること

C = *のB 'であると信じて。

+0

これは、m行m列の結果ではなく、n行n列の結果を生成します。 – gnovice