Erweitern einer 2D-Matrix zu einer 3D-Matrix durch Multiplizieren mit einem Vektor [Duplikat]

7

Hier, was ich erreichen möchte:

Ich habe eine Matrix C

%Vor%

Und ein Vektor a

%Vor%

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 :

kommt %Vor%

Es würde sicherlich mit einer Schleife funktionieren, aber da ich diese Operation mehrfach benötige, wäre ein Oneliner ein großer Sparer.

    
Artem Moskalew 22.02.2016, 13:23
quelle

5 Antworten

10

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:

%Vor%

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.

    
hbaderts 22.02.2016 13:36
quelle
6

Einige reshape und einige bsxfun wird Folgendes tun:

%Vor%

Wie in hbaders vorgeschlagen, könnte man auch bsxfun 's Fähigkeit verwenden Dimensionserweiterung und bieten einen permutierten Vektor von Faktoren:

%Vor% %Vor%     
thewaywewalk 22.02.2016 13:32
quelle
6

Ich habe eine andere Methode für den Benchmark-Vergleich ... IMO es ist der beste Weg, zumindest für den Syntax / Lesbarkeit Begriff:

%Vor%     
Adiel 22.02.2016 14:36
quelle
4

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:

%Vor%     
Luis Mendo 22.02.2016 13:59
quelle
4

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 ):

%Vor%

Dies ist die elementweise Multiplikation zweier Arrays. Die erste ist Ihre ursprüngliche Matrix C repeated numel(a) mal in der dritten Dimension:

%Vor%

Die zweite hat dieselbe Größe wie die erste, wobei jede Scheibe das entsprechende Element von a enthält:

%Vor%     
Geoff 22.02.2016 13:38
quelle