Ich verwende eine affine Transformationsmatrix, um 2D-Koordinaten vom Bildschirm (Größe 10e3) in kleine Teile fraktaler Mengen (Größe nur 10e-15) zu transformieren.
Ich muss auch umgekehrt abbilden, also invertiere ich einfach die Matrix. Es funktioniert, wenn die Größen nicht zu weit voneinander entfernt sind, aber es schlägt fehl, wenn die Determinante zu nahe an Null kommt, um mit Standarddoppelzahlen dargestellt zu werden.
Die Matrizen, die ich benutze, haben folgende Form:
a c e
b d f
0 0 1
Und der Inversionsalgorithmus, den ich habe, ist:
var dt = a * d - b * c;
return new Matrix(d/dt, -b/dt, -c/dt, a/dt, (c * f - d * e) / dt, -(a * f - b * e) / dt);
Gibt es eine alternative Möglichkeit, die Matrix zu invertieren? Ich bin nicht sehr gut in Mathematik, daher würde ich eine einfache Lösung benötigen und eine, für die ich den Code oder einen Algorithmus finden könnte.
Ein Beispiel für eine solche Matrix:
3.26091378894248e-9 -1.882689453850103e-9 -0.7172216437740687
-1.882689453814925e-9 -3.2609137888815494e-9 -0.23371832131832268
0 0 1
Antworten:
Ich habe eine Lösung für mein spezifisches Problem gefunden. Anstatt die Determinante zu berechnen und die Präzisionswand zu treffen, verwende ich Schritt für Schritt die Gauß-Jordan-Methode.
In meinem speziellen Fall von affinen Transformationsmatrizen und dem von mir verwendeten Wertebereich stoße ich auf diese Weise auf kein Präzisionsproblem.
quelle