2014-01-13 8 views
5

Ich muss eine Matrix A mit n Matrizen multiplizieren, und n Matrizen zurück erhalten. Multiplizieren Sie beispielsweise eine 2x2-Matrix mit 3 2x2-Matrizen, die als 2x2x3-Matlab-Array gestapelt sind. bsxfun ist, was ich normalerweise für solche Situationen verwende, aber es gilt nur für elementweise Operationen. Ich könnte so etwas wie:bsxfun-like für Matrix Produkt

blkdiag(a, a, a) * blkdiag(b(:,:,1), b(:,:,2), b(:,:,3)) 

aber ich brauche eine Lösung für beliebige n -?

+2

http://www.mathworks.com/matlabcentral/newsreader/view_thread/311944 die Kommentare Besuche für FEX Links – Dan

+0

jetzt nicht testen können, aber in dem Beispiel 'times' verwendet wird, vielleicht kann 'mttimes' hier ersetzt werden. –

Antwort

7

Sie die gestapelten Matrizen reshape können. Angenommen, Sie k -by- k Matrix a und ein Stapel von mk -by- k Matrizen sb und Sie haben das Produkt a*sb(:,:,ii) für ii = 1..m wollen. Dann alles, was Sie brauchen, ist

sza = size(a); 
b = reshape(b, sza(2), []); % concatenate all matrices aloong the second dim 
res = a * b; 
res = reshape(res, sza(1), [], size(sb,3)); % stack back to 3d 
+0

+1 Gut gedacht. Aber du musst 'size (sb, 3)' vor dem Umformen von 'b' speichern, um es am Ende zu verwenden. –

+0

@LuisMendo Wenn du genau acht gibst habe ich zwei Variablen:' sb' für die "stacked" Version und nur "b" für die Größe. – Shai

+0

Oh ich verstehe. Ich dachte du benutzt (und überschreibst) 'b'. –

3

Ihre Lösung kann auf eine beliebige Größe comma-saparated lists von Zellen-Arrays unter Verwendung angepasst werden:

[k m n] = size(B); 
Acell = mat2cell(repmat(A,[1 1 n]),k,m,ones(1,n)); 
Bcell = mat2cell(B,k,m,ones(1,n)); 
blkdiag(Acell{:}) * blkdiag(Bcell{:}); 

Sie könnten dann die Blöcke auf einem 3D-Array-Stack this answer verwenden und nur die relevanten diejenigen halten.

Aber in diesem Fall eine gute alte Schleife ist wahrscheinlich schneller:

C = NaN(size(B)); 
for nn = 1:n 
    C(:,:,nn) = A * B(:,:,nn); 
end