Ich suche nach einer Beispielcode-Implementierung zum Invertieren einer 4x4-Matrix. Ich weiß, dass es Gaußsche Eleminiation, LU-Zerlegung usw. gibt, aber anstatt sie im Detail zu betrachten, suche ich wirklich nur nach dem Code, um dies zu tun.
Sprache idealerweise C ++, Daten sind in Array von 16 Floats in Spalten-Hauptreihenfolge verfügbar.
Antworten:
Hier:
Dies wurde aus der MESA- Implementierung der GLU-Bibliothek gestrichen.
quelle
Wenn jemand mehr kostümierten Code und "einfacher zu lesen" sucht, dann habe ich diesen
Ich schreibe den Code nicht, aber mein Programm hat es getan. Ich habe ein kleines Programm erstellt , um ein Programm zu erstellen, das die Determinante und Inverse einer N-Matrix berechnet.
Ich mache das, weil ich in der Vergangenheit einmal einen Code brauche, der die 5x5-Matrix umkehrt, aber niemand auf der Erde hat dies getan, also habe ich einen gemacht.
Schauen Sie sich hier das Programm an .
BEARBEITEN: Das Matrixlayout ist zeilenweise (dh
m01
in der ersten Zeile und zweiten Spalte). Auch die Sprache ist C #, sollte aber leicht in C konvertiert werden können.quelle
Wenn Sie eine C ++ - Matrixbibliothek mit vielen Funktionen benötigen, besuchen Sie die Eigenbibliothek - http://eigen.tuxfamily.org
quelle
Ich habe die MESA-Implementierung "aufgerollt" (habe auch ein paar Unit-Tests geschrieben, um sicherzustellen, dass sie tatsächlich funktioniert).
Hier:
Ich habe ein wenig darüber geschrieben und das Muster der positiven / negativen Faktoren in meinem Blog angezeigt .
Wie von @LiraNuna vorgeschlagen, sind auf vielen Plattformen hardwarebeschleunigte Versionen solcher Routinen verfügbar, sodass ich froh bin, eine 'Backup-Version' zu haben, die lesbar und präzise ist.
Hinweis : Dies kann 3,5-mal langsamer oder schlechter als die MESA-Implementierung sein. Sie können das Muster der Faktoren verschieben, um einige Ergänzungen usw. zu entfernen. Dies würde jedoch an Lesbarkeit verlieren und dennoch nicht sehr schnell sein.
quelle
Sie können die GNU Scientific Library verwenden oder den Code darin nachschlagen.
Bearbeiten: Sie scheinen den Abschnitt Lineare Algebra zu wollen .
quelle
Hier ist eine kleine (nur ein Header) C ++ - Vektor-Mathematikbibliothek (ausgerichtet auf 3D-Programmierung). Wenn Sie es verwenden, denken Sie daran, dass das Layout der Matrizen im Speicher im Vergleich zu den Erwartungen von OpenGL invertiert ist. Ich hatte Spaß daran, es herauszufinden ...
quelle
Inspiriert von @shoosh, um MESA-Implementierungen zu überprüfen, stellte ich fest, dass die Matrixinversion in neueren Mesa-Versionen ganz anders aussieht. Ich nehme an, das sind gute Verbesserungen. Hier ist der Matrix-Inversionscode aus Mesa-17.3.9 :
Hinweis: Sie finden diesen Code in der Mesa-Codebasis :
mesa-17.3.9/src/mesa/math/m_matrix.c
.quelle
Dies ist die C ++ - Version für die Antwort von @ willnode
quelle
Sie können es laut diesem Blog schneller machen .
Dies ist keine vollständige Implementierung, da P möglicherweise nicht invertierbar ist. Sie können diesen Code jedoch mit der MESA-Implementierung kombinieren, um eine bessere Leistung zu erzielen.
quelle