Hier, was ich erreichen möchte:
Ich habe eine Matrix C
%Vor% Und ein Vektor a
Ich möchte eine solche Operation machen, dass jedes Element des Vektors a
mit C
(Skalarmultiplikation) multipliziert wird und out ein 3-dimensionales Array D
:
Es würde sicherlich mit einer Schleife funktionieren, aber da ich diese Operation mehrfach benötige, wäre ein Oneliner ein großer Sparer.
Dies ist ein schönes Beispiel für die Verwendung von bsxfun
und reshape
. Während @thewaywewalks vorschlägt, zuerst bsxfun
aufzurufen und das Ergebnis neu zu gestalten, würde ich das Gegenteil vorschlagen. Dies macht eines der Schlüsselkonzepte von bsxfun
- die Erweiterung der Singleton-Dimension - klarer:
Mit reshape(a,1,1,[])
machen Sie a
in der dritten Dimension. Wenn Sie jetzt bsxfun
anwenden, wird die Matrix C
mit jedem Element von a
multipliziert.
Eine andere Möglichkeit ist die Matrixmultiplikation von C
als Spaltenvektor mal a
als Zeilenvektor (dies gibt alle elementweisen Produkte an) und dann reshape
das Ergebnis:
BEARBEITEN (BENCHMARKING): Da mehrere Lösungen (einschließlich meiner unten) vorgeschlagen wurden, hier ein grobes Benchmarking, um die verschiedenen Lösungen mit größeren Arrays zu vergleichen:
%Vor%... was darauf hindeutet, dass @hbaders Lösung am schnellsten ist, dann @ Adiels, dann @Luis Mendos, dann @ thewaywewalks (1), dann meins, dann @ thewaywewalks (2).
Meine Lösung:
Eine weitere Option, die repmat
und reshape
(nicht bsxfun
):
Dies ist die elementweise Multiplikation zweier Arrays. Die erste ist Ihre ursprüngliche Matrix C
repeated numel(a)
mal in der dritten Dimension:
Die zweite hat dieselbe Größe wie die erste, wobei jede Scheibe das entsprechende Element von a
enthält:
Tags und Links arrays matlab multidimensional-array matrix