Determinante eines mehrdimensionalen Arrays

8

Ich versuche, die Determinante eines numpy Array M zu berechnen, mit np.shape (M) = (N, L, L) ist etwas wie:

%Vor%

Gibt es einen Weg ohne Schleife? "N" ist einige Größenordnungen größer als "L". Ich dachte an etwas wie:

%Vor%

Gibt es einen schnelleren Weg, was ich will? Ich denke, der Schleifenoverhead ist ein Leistungsengpass, weil die Determinante kleiner Matrizen eine relativ billige Operation ist (oder irre ich mich?).

    
user1825991 15.11.2012, 08:21
quelle

3 Antworten

8

Sie müssen np.linalg.det ändern, um die Geschwindigkeit zu erhalten. Die Idee ist, dass det() eine Python-Funktion ist, zuerst eine Menge prüft und dann die Fortran-Routine aufruft und ein Array berechnet, um das Ergebnis zu erhalten.

Hier ist der Code von numpy:

%Vor%

Um diese Funktion zu beschleunigen, können Sie die Prüfung weglassen (es wird Ihre Verantwortung, die Eingabe richtig zu halten), die Fortran-Ergebnisse in einem Array sammeln und die abschließenden Berechnungen für alle kleinen Arrays ohne for-Schleife durchführen.

Hier ist mein Ergebnis:

%Vor%

und die Geschwindigkeit ist:

%Vor%

Auf diese Weise können Sie 15 Mal schneller werden. Das ist ein gutes Ergebnis ohne kompilierten Code.

Hinweis: Ich unterlasse die Fehlerprüfung für die Fortran-Routine.

    
HYRY 15.11.2012 12:54
quelle
2

Ich konnte apply_over_axes nicht zur Arbeit bringen, weil dies ein 3D-Array ist, denke ich. Wie auch immer, das Profiling des Codes zeigt, dass das Programm wenig Zeit in der Schleife verbringt,

%Vor%

Das Ergebnis ist "0.955 Sekunden" Laufzeit, mit 0.930s kumulativer Zeit in linalg.py:1642(det).

Wenn ich denselben Test mit 2x2 Matrizen durchführe, bekomme ich .844s der Gesamtzeit und .821s in linalg.py:1642(det), obwohl die Matrizen klein sind. Dann scheint es, dass die det() -Funktion, die einen großen Aufwand für kleine Matrizen hat.

Bei 30x30 bekomme ich eine Gesamtzeit von 1.198s und eine Zeit in det() von 1.172.

Bei 70x70 ist die Summe 3.122 und die Zeit in det() ist 3.094, mit weniger als 1% in der Schleife.

Es scheint in jedem Fall, dass es sich nicht lohnt, die Pythonschleife zu optimieren.

    
gg349 15.11.2012 12:22
quelle
-1

Ich habe gerade den VBA-Code für die Berechnung der Determinante der Matrix mit der Pivot-Methode abgeschlossen.

Ich hoffe, das ist hilfreich

%Vor%
Phambao 08.02.2017 09:19
quelle