Ist es möglich, in Python eine Umkehrung der Sparse-Matrix so schnell wie in Matlab zu berechnen?

8

Es dauert 0,02 Sekunden, bis Matlab die Inverse einer diagonalen Matrix mit dem Sparse-Befehl berechnet.

%Vor%

Aber für den Python-Code dauert es ewig - mehrere Minuten.

%Vor%

Ich habe versucht, Scipy.sparse Modul zu verwenden, aber es hat nicht geholfen. Die Laufzeit ist gesunken, aber nur auf 40 Sekunden.

%Vor%

Ist es möglich, den Code so schnell auszuführen, wie er in Matlab läuft?

    
P.Escondido 11.02.2014, 05:09
quelle

4 Antworten

8

Hier ist die Antwort. Wenn Sie Inv in Matlab für eine dünn besetzte Matrix ausführen, überprüft Matlab verschiedene Eigenschaften der Matrix, um die Berechnung zu optimieren. Für eine dünne diagonale Matrix können Sie den folgenden Code ausführen, um zu sehen, was Matlab macht

%Vor%

Matlab wird Folgendes drucken:

%Vor%

Matlab invertiert also nur die Diagonale.

Wie invertiert Scipy die Matrix? Hier haben wir den Code :

%Vor%

und spsolve

%Vor%

d. h., faktorisieren A und dann eine Menge linearer Systeme, wobei die rechten Seiten die Koordinatenvektoren sind (die die Identitätsmatrix bilden). Indem wir alle Lösungen in einer Matrix anordnen, erhalten wir das Inverse der ursprünglichen Matrix.

Wenn matlab die diagonale Struktur der Matrix ausnutzt, aber scipy nicht ist (scipy verwendet natürlich auch die Struktur der Matrix, aber in einer weniger effizienten Weise, zumindest für das Beispiel), sollte matlab sein viel schneller.

BEARBEITEN Um sicher zu sein, wie @P.Escondido vorgeschlagen, werden wir eine geringfügige Modifikation in Matrix A versuchen, um die Matlab-Prozedur zu verfolgen, wenn die Matrix nicht diagonal ist:

%Vor%

Es gibt Folgendes aus:

%Vor%     
sebas 12.02.2014, 23:52
quelle
4

Wie wäre es mit splu() , es ist schneller, benötigt aber ein dichtes Array und ein dichtes Array:

Erstellen Sie eine zufällige Matrix:

%Vor%

Berechnung der inversen Matrix nach splu() :

%Vor%

Überprüfen Sie das Ergebnis:

%Vor%

Hier ist die% Zeit Ausgabe:

%Vor%     
HYRY 11.02.2014 12:44
quelle
3

Sie halten entscheidende Informationen von Ihrer Software fern: Die Tatsache, dass die Matrix diagonal ist, macht es superleicht zu invertieren: Sie invertieren einfach jedes Element seiner Diagonale:

%Vor%

Das gilt natürlich nur für diagonale Matrizen ...

    
Shai 11.02.2014 07:16
quelle
0

Wenn Sie damit versuchen, wird das Ergebnis besser sein:

%Vor%

Jetzt können Sie mit Ihrem Matlab-Skript vergleichen.

    
sebas 11.02.2014 13:01
quelle