Effizientere und schnellere Invertierung von Matrizen in C ++ (groß und klein)

8

Während ich über Matrixinversionsalgorithmen google, habe ich festgestellt, dass es verschiedene Wege (und Meinungen!) gibt, wie man das im Code macht. Ich fragte mich, welche Methode die schnellste oder die mit der besten Leistung ist, und als ich versuchte, diese Antwort zu finden, fand ich nichts.

Ich weiß, dass für einige Fälle eine Pseudoinverse berechnet werden kann (mit SVD, Cholevsky, ...), ich benutze tatsächlich einige davon in meinem Code, und ich weiß, dass ein Inverse einfach nicht existiert usw. Es ist leicht, eine spezifische Antwort für ein spezifisches Problem zu finden, aber keine allgemeine Intuition für dieses große (RIESIGE!) Problem, das Matrixinversion ist.

Meine Frage ist also:

Welche Methode bietet die beste Leistung für kleine Matrizen? Und in Präzision? Was ist mit großen Matrizen?

Mein persönlicher Fall ist eine 6x6 (EDIT: symmetrische) Matrix, die tausende Male invertiert werden muss (ja, ja, mit verschiedenen Werten) und ich brauche hohe Präzision, aber sicher würde die Geschwindigkeit sehr nützlich sein.

>

Beachten Sie, dass ich nicht nach Code suche, ich werde mich selbst kodieren, was auch immer am besten zu meinem Fall passt, aber ich denke, das ist eine Frage, die viele Programmierer gerne wissen würden.

>     
Ander Biguri 16.01.2013, 14:43
quelle

1 Antwort

5

Es gibt keine einfache Antwort. Stellen Sie sicher, dass Sie diesen Artikel gelesen und verstanden haben.

Für 2x2-Matrizen kann die Umkehrung mit einem einfachen Formular durchgeführt werden, das die Determinante beinhaltet. Aber für etwas Größeres würde ich Faktorisierungen bevorzugen, zum Beispiel eine schwenkbare LU-Faktorisierung. Wenn Sie sich Sorgen um die Leistung machen und mit großen dünn besetzten Matrizen arbeiten, ist möglicherweise ein iterativer Solver geeignet. Alternativ können Sie MUMPS (Multifrontal Massive Parallel Solver) ausprobieren und die Leistung messen. Das Problem mit iterativen Solvern ist, dass ihre Konvergenzgeschwindigkeit stark von der Bedingung des inversen Problems abhängt und ob Sie gute Vorkonditionierer finden.

Vielleicht sollten Sie mit der Bibliothek Eigen beginnen und die LU-Faktorisierung zuerst ausprobieren.

    
sellibitze 16.01.2013, 15:00
quelle