3

Ich bin auf der Suche für eine schnelle und flexible Möglichkeit, den folgend in Matlab zu berechnen, ohne mit einer Schleife:schneller Weg für Vektor/Array-Multiplikation in Matlab

c = 1:5; 
A = reshape(1:5^3,5,5,5); 
res= c(1)*A(:,:,1)+...+c(5)*A(:,:,5) 

denke ich, die Arbeit mit

sum(A,3) 

könnte ein schöner Weg sein, solange ich die Multiplikation entlang der dritten Dimension durchführen kann. Eine Lösung (aber mit Schleife) wäre:

val = zeros(length(c),length(c)) 
for i = 1:length(c) 
    val = val+c(i)*A(:,:,i) 
end 

Ich frage mich nur, wenn dies in einer einfacheren (und eleganten) Art und Weise vermeidet die Schleife durchgeführt werden.

+0

besser ein liitle Bit Klären Sie Ihre Frage. Du willst was multiplizieren? – 16per9

+0

Ich möchte res am Ende des Tages erhalten. Mit anderen Worten, ich möchte die ganze Matrix A (:,:, 1) mit dem Skalar c (1) multiplizieren, die ganze Matrix A (:, :, 2) mit dem Skalar c (2) und so weiter ... am Ende möchte ich jede dieser fünf Matrizen zusammenfassen, so dass res eine Matrix ist. – muffin1974

Antwort

4

Ja, das ist ein perfekter Job für bsxfun und permute:

res = sum(bsxfun(@times,A,permute(c,[3,1,2])),3) 

Sie c in der dritten Dimension senden permute(c,[3,1,2]) verwenden. Dann wird durch Aufruf von bsxfun jede der Matrizen in A mit dem entsprechenden (permutierten) c multipliziert. Schließlich können Sie eine sum über die dritte Dimension tun.

6

Sie können A von 3D zu 2D neu zu gestalten, verwenden Sie die very efficient matrix-multiplication, die Ihnen eine 1D Array und schließlich neu zu gestalten zurück zu 2D für die endgültige Ausgabe, wie so geben -

res = reshape(reshape(A,[],size(A,3))*c(:),size(A,1),[]) 
Verwandte Themen