Frage

Ich möchte eine 4x4-Matrix invertieren. Meine Zahlen in Festkommaformat gespeichert werden (1.15.16 um genau zu sein).

Mit Gleitkommaarithmetik Regel baue ich nur die adjungierten Matrix und dividieren durch die Determinante (z.B. brut die Lösung erzwingen). Das war für mich so weit, aber wenn sie mit Festpunktzahlen zu tun bekomme ich eine nicht akzeptable Präzision Verlust durch alle Multiplikationen verwendet.

Hinweis: In Festkommaarithmetik werfe ich immer einige der am wenigsten signifikanten Bits der sofortigen Ergebnisse entfernt

.

So - Was ist die numerische stabil eine Matrix zu invertieren? Ich habe nicht viel dagegen, über die Leistung, sondern einfach gehen zu Gleitkommazahlen wäre auf meiner Zielarchitektur zu verlangsamen.

War es hilfreich?

Lösung

Ich denke, die Antwort auf diese Frage über die genaue Form der Matrix abhängt. Eineine Standard-Zersetzungsverfahren (LU, QR, Cholesky etc.) mit Verschwenken (einem essentiellen) sind ziemlich gut auf Festpunkt, insbesondere für eine kleine 4x4-Matrix. Siehe das Buch 'Numerical Recipes' von Press et al. Eine Beschreibung dieser Methoden.

dieses Papier leider gibt einige nützliche Algorithmen, aber hinter einem paywall ist. Sie empfehlen eine (geschwenkt) Cholesky-Zerlegung mit einigen zusätzlichen Features zu kompliziert, um hier.

Andere Tipps

Meta-Antwort: Ist es wirklich eine allgemeine 4x4-Matrix? Wenn Ihre Matrix eine besondere Form hat, dann gibt es direkte Formeln zum Umkehren so schnell sein würde, und Ihren Betrieb halten abzulaufen.

Zum Beispiel, wenn es ein Standard Homogene Koordinaten von Grafiken verwandeln, wie:

[ux vx wx tx]
[uy vy wy ty]
[uz vz wz tz]
[ 0  0  0  1]

(unter der Annahme einer Zusammensetzung von Rotation, Skalierung, Translation Matrizen)

dann ein leicht ableitbar direkte Formel , das ist

[ux uy uz -dot(u,t)]
[vx vy vz -dot(v,t)]
[wx wy wz -dot(w,t)]
[ 0  0  0     1    ]

(ASCII-Matrizen aus der gelinkten Seite gestohlen.)

Sie können sich wahrscheinlich schlagen, dass nicht für den Verlust an Präzision in festen Punkt.

Wenn Sie Ihre Matrix von einiger Domain kommt, wo Sie wissen, dass es mehr Struktur hat, dann gibt es wahrscheinlich eine einfache Antwort sein.

Ich möchte zweitens die Frage Jason S angehoben: Sind Sie sicher, dass Sie Ihre Matrix invertieren müssen? Dies ist fast nie nötig. Nicht nur das, es ist oft eine schlechte Idee. Wenn Sie Ax = b lösen müssen, ist es numerisch stabil das System direkt zu lösen als B durch eine inverse zu multiplizieren.

Auch wenn Sie Ax = b über zu lösen haben und immer wieder für viele Werte von b, es ist immer noch nicht eine gute Idee, A. invertieren Sie können Faktor A (sagen wir LU-Faktorisierung oder Cholesky-Faktorisierung) und die Faktoren, spart so dass Sie nicht, dass die Arbeit jedes Mal redoing, aber Sie würden immer noch das System jedes Mal mit der Faktorisierung lösen.

Lassen Sie mich eine andere Frage stellen: Sie brauchen auf jeden Fall die Matrix zu invertieren (es nennen M), oder müssen Sie die inverse Matrix verwenden, um andere Gleichungen zu lösen? (Z Mx = b für bekannten M, b) Oft gibt es andere Möglichkeiten, dies zu tun, w / o explizit um die inversen zu berechnen. Oder wenn die Matrix M ist eine Funktion der Zeit und es ändert sich langsam, dann könnten Sie die volle inverse einmal berechnen, und es gibt iterative Möglichkeiten, es zu aktualisieren.

Um Rundungsfehler und andere Schlechtigkeit zu minimieren, verwenden „Schwenken“ - das Kapitel siehe Matrizen in Numerical Recipes invertieren. Sie haben die beste Erklärung, die ich bisher gefunden habe.

Sie sollten erwägen, um 1.31 verdoppeln, bevor Sie Ihren normalen Algorithmus zu tun. Es wird die Anzahl der Multiplikationen verdoppeln, aber Sie tun, eine Matrix invertieren und alles, was Sie tun, wird sich ziemlich an den Multiplikator in Ihrem Prozessor gebunden werden.

Für alle Interessierten in die Gleichungen für ein 4x4 Invertzucker gefunden haben, können Sie einen symbolischen mathematischen Paket verwenden sie für Sie zu lösen. Die TI-89 wird es auch tun, obwohl es einige Minuten dauern werden.

Wenn Sie geben uns eine Vorstellung von dem, was die Matrix invertieren für Dich tut, und wie es mit dem Rest der Verarbeitung paßt könnten wir in der Lage sein, Alternativen vorzuschlagen.

-Adam

Einfache alte Gauß-Elimination würde gut funktionieren.

Es hängt davon ab, welche Bibliotheken / Klassen / Strukturen Sie verwenden. Sie konnten einen Blick auf die GSL .

Wenn die Matrix eine affine Abbildung darstellt (oft ist dies der Fall mit 4x4 Matrizen so lange, wie Sie eine Skalierungskomponente nicht tun einführen) die inversen ist einfach die Transponierung des oberen 3x3 Drehteils mit der letzten Spalte negierte. Natürlich, wenn Sie eine allgemeine Lösung sucht dann in der Gauß-Elimination erforderlich ist wahrscheinlich die einfachste.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top