Allg. Formel um 3x3 Matrix zu invertieren
-
Hallo,
ich hab hier eine allgemeine Formel um von einer 3x3 Matrix die Inverse zu bilden. Aber irgendwie komm ich nicht damit zurecht. Kann mir jemand die Formel erklären?
Die Inverse von
(a b c)
(d e f) = A
(g h i)ist
( -f h + e i c h - b i - c e + b f )
1/det(A) * ( f g - d i - c g + a i - d b + a e )
( - e g + d h b g - a h - b d + a e )Gruß und danke,
Amalthea
-
Hi!
Schreib mal deine Inverse in Code-Tags und mach zwischen den Spalten
einige Leerzeichen. Man kann so gar nicht erkennen, was eine Spalte ist.Jockel
-
Hallo,
genau das ist ja mein Problem. Ich hab die Formel so vorgefunden... und hab keine Ahnung, was da jetzt eine Spalte ist...
Gruß,
Amalthea
-
-
nimm deine matrix und fuege an eine der beiden seiten die einheitsmatrix an
dann formst du die neue matrix so um dass deine orginalseite die einheitsmatrix ist
dann steht auf der andren wo vorher die einheitsmatrix war die inverse
-
Hallo,
wie ich das "von Hand" mache, ist mir klar.
Ich brauche aber eine Formel um das Programmieren zu können...
Gruß,
Amalthea
-
Eine allgemeine Formel für wäre z.B.:
A^{-1}=\frac{1}{\det{A}}\cdot\left[ \begin {array}{ccc} {a_{22}}\,{a_{33}}-{a_{23}}\,{a_{32}}&-{a_{12}}\,{a_{33}}+{a_{13}}\,{a_{32}}&{a_{12}}\,{a_{23}}-{ a_{13}}\,{a_{22}}\\-{a_{21}}\,{a_{33}}+{a_{23}}\,{ a_{31}}&{a_{11}}\,{a_{33}}-{a_{13}}\,{a_{31}}&-{a_{11}}\,{ a_{23}}+{a_{13}}\,{a_{21}}\\{a_{21}}\,{a_{32}}-{ a_{22}}\,{a_{31}}&-{a_{11}}\,{a_{32}}+{a_{12}}\,{a_{31}}&{ a_{11}}\,{a_{22}}-{a_{12}}\,{a_{21}}\end {array} \right]wobei
Probiers mal aus...
-
Hallo,
danke für die Formel ich werd sie auf jeden Fall ausprobieren.
Gruß,
Amalthea
-
Hallo,
ich habs getestet und die Formel stimmt. Vielen Dank!
Gibt es für das Berechnen von Eigenvektoren einer 3x3 Matrix auch so ne schlaue Formel?Fabian
// Achtung: nur für diagonale Matrizen geeignet, siehe Kommentare!
// Eingabematrix ist tmpC, tmpCI wird gefüllt als inv(tmpC)
bool Ellipsefitting::filltmpCI(){
// calculate determinant:
float dettmpC = tmpC[0][0]*tmpC[1][1]*tmpC[2][2] - tmpC[0][0]*tmpC[1][2]*tmpC[2][1] - tmpC[1][0]*tmpC[0][1]*tmpC[2][2]
+ tmpC[1][0]*tmpC[0][2]*tmpC[2][1] + tmpC[2][0]*tmpC[0][1]*tmpC[1][2] - tmpC[2][0]*tmpC[0][2]*tmpC[1][1];
// check determinant:
if (dettmpC>1000000 || dettmpC<0.000001){
cout<<"numerical instability in Ellipsefitting::filltmpCI(); determinant of tmpC is "<<dettmpC<<endl;
return false;
}
// calculate value in upper left:
tmpCI[0][0] = tmpC[1][1]*tmpC[2][2] - tmpC[1][2]*tmpC[2][1];
// calculate value in upper middle:
tmpCI[1][0] = -tmpC[0][1]*tmpC[2][2] + tmpC[0][2]*tmpC[2][1];
// calculate value in upper right:
tmpCI[2][0] = tmpC[0][1]*tmpC[1][2] - tmpC[0][2]*tmpC[1][1];
// calculate value in middle left (same as upper middle):
tmpCI[0][1] = tmpCI[1][0];
// calculate value in middle middle:
tmpCI[1][1] = tmpC[0][0]*tmpC[2][2] - tmpC[0][2]*tmpC[2][0];
// calculate value in middle right:
tmpCI[2][1] = -tmpC[0][0]*tmpC[1][2] + tmpC[0][2]*tmpC[1][0];
// calculate value in lower left (same as upper right):
tmpCI[0][2] = tmpCI[2][0];
// calculate value in lower middle (same as middle right):
tmpCI[1][2] = tmpCI[2][1];
// calculate value in lower right:
tmpCI[2][2] = tmpC[0][0]*tmpC[1][1] - tmpC[0][1]*tmpC[1][0];
// divide by determinant:
for (int x=0; x<3; x++)
for (int y=0; y<3; y++)
tmpCI[x][y] /= dettmpC;
return true;
}// end filltmpCI