MATLAB: Wie vektorisiert man zwei Matrixmatrizen?

8

Ich habe zwei 3-dimensionale Arrays, deren erste zwei Dimensionen Matrizen repräsentieren und die letzte durch einen Parameterraum zählt. Als einfaches Beispiel nehmen Sie

%Vor%

(aber nehmen wir an, dass A(:,:,j) für jedes j unterschiedlich ist). Wie kann man leicht eine j -Matrix-Multiplikation von zwei solchen Matrix-Arrays A und B ?

durchführen %Vor%

macht die Arbeit sicherlich, aber wenn die dritte Dimension eher 1e3-Elemente ist, ist das sehr langsam, da sie nicht die Vektorisierung von MATLAB verwendet. Also, gibt es einen schnelleren Weg?

    
Tobias Kienzler 05.07.2011, 09:40
quelle

5 Antworten

3

Ich empfehle dringend, die MMX-Toolbox zu verwenden > von Matlab. Es kann n-dimensionale Matrizen so schnell wie möglich multiplizieren.

Die Vorteile von MMX sind:

  1. Es ist einfach zu verwenden.
  2. Multipliziere n-dimensionale Matrizen (tatsächlich kann es Arrays von 2D-Matrizen multiplizieren)
  3. Es führt andere Matrixoperationen durch (Transponieren, Quadratische Multiplikation, Chol-Zerlegung und mehr)
  4. Es verwendet C-Compiler und Multi-Thread Berechnung für die Beschleunigung.

Für dieses Problem müssen Sie nur diesen Befehl schreiben:

%Vor%

Ich habe @ Amros Antwort die folgende Funktion hinzugefügt

%Vor%

Ich habe dieses Ergebnis für n=2,m=2,p=1e5 :

erhalten %Vor%

Ich habe @ Amros Code benutzt, um den Benchmark zu starten.

    
Ali Mirzaei 08.09.2015, 22:39
quelle
6

Ich habe jetzt einige Timing-Tests gemacht, der schnellste Weg für 2x2xN ist die Berechnung der Matrix-Elemente:

%Vor%

Im allgemeinen Fall stellt sich heraus, dass die for-Schleife tatsächlich die schnellste ist (vergiss nicht, C vorher zuzuweisen!).

Sollte man schon das Ergebnis als Zellen-Array von Matrizen haben, dann ist cellfun die schnellste Wahl, es ist auch schneller als das Schleifen über die Zellenelemente:

%Vor%

Sie müssen jedoch num2cell zuerst ( Ac = num2cell(A, [1 2]) ) und cell2mat aufrufen Der 3D-Array-Fall verschwendet zu viel Zeit.

Hier ist ein Timing für einen zufälligen Satz von 2 x 2 x 1e4:

%Vor%

Explicit bezieht sich auf die direkte Berechnung der 2 x 2 Matrixelemente, siehe unten. Das Ergebnis ist ähnlich für neue zufällige Arrays, cellfun ist am schnellsten, wenn vorher kein num2cell benötigt wird und es keine Beschränkung auf 2x2xN gibt. Für allgemeine 3D-Arrays ist die Schleife über die dritte Dimension in der Tat die schnellste Wahl. Hier ist der Timing-Code:

%Vor%     
Tobias Kienzler 05.07.2011 09:54
quelle
4

Hier ist mein Vergleichstest, der die in TEITIT , um genauere Zeiteinstellungen zu erhalten.

%Vor%

Die Ergebnisse:

%Vor%

Wie ich in den Kommentaren erklärt habe, ist eine einfache FOR-Schleife die beste Lösung (kurz Schleife abwickeln in der letzter Fall, der nur für diese kleinen 2-by-2-Matrizen möglich ist.

    
Amro 14.07.2011 00:45
quelle
1

Eine Technik wäre es, eine 2Nx2N-Sparse-Matrix zu erstellen und auf der Diagonale die 2x2-Matrizen für A und B einzubetten. Führe das Produkt mit dünn besetzten Matrizen aus und nimm das Ergebnis mit etwas cleverer Indizierung und verändere es zu 2x2xN.

Aber ich bezweifle, dass das schneller sein wird als einfaches Looping.

    
eat 05.07.2011 10:37
quelle
1

Eine noch schnellere Methode ist meiner Erfahrung nach die Punktmultiplikation und -summierung über die dreidimensionale Matrix. Die folgende Funktion, Funktion z_matmultiply (A, B) multipliziert zwei dreidimensionale Matrizen, die die gleiche Tiefe haben. Die Punktmultiplikation wird so parallel wie möglich durchgeführt. Daher empfiehlt es sich, die Geschwindigkeit dieser Funktion zu überprüfen und sie über eine große Anzahl von Wiederholungen mit anderen zu vergleichen.

%Vor%     
Ruben 22.10.2013 15:06
quelle