10

Ich habe festgestellt, dass, wenn A eine NxN-Matrix ist und es die inverse Matrix hat. Aber was die Funktion inv() und pinv() ausgibt, ist anders. - Meine Umgebung ist Win7x64 SP1, Matlab R2012a, Cygwin Octave 3.6.4, FreeMat 4.2Warum ist die Ausgabe von inv() und pinv() in Matlab und Octave nicht gleich?

ein Blick auf die Beispiele von Oktave:

A = rand(3,3) 
A = 
0.185987 0.192125 0.046346 
0.140710 0.351007 0.236889 
0.155899 0.107302 0.300623 

pinv(A) == inv(A) 
ans = 
0 0 0 
0 0 0 
0 0 0 
  • Es ist alles das gleiche ans Ergebnis durch die Lauf Derselbe Befehl oben in Matlab.

  • Und ich berechnen inv(A)*A oder A*inv(A), ist das Ergebnis Identität 3x3 Matrix in beiden Octave und Matlab.
  • Das Ergebnis von A*pinv(A) und pinv(A)*A sind Identität 3x3-Matrix in Matlab und FreeMat.
  • Das Ergebnis von A*pinv(A) ist Identität 3x3 Matrix in Octave.
  • Das Ergebnis von pinv(A)*A ist nicht Identität 3x3 Matrix in Octave.

Ich weiß nicht, der Grund, warum inv(A) != pinv(A), ich die Details des Elements in der Matrix in Betracht gezogen haben. Es scheint das Floating-Genauigkeitsproblem zu sein, das dieses Problem verursacht.

  • 6.65858991579923298331777914427220821380615200000000 Element in inv(A)(1,1) gegen

  • 6.65858991579923209513935944414697587490081800000000 Element in pinv(A)(1,1)

+0

möglich Duplikat (http: // Stackoverflow. com/questions/1419580/why-is-matlabs-inv-langsam-und-ungenaue) – Shai

+0

@Shai, ich glaube, OP könnte von der Lektüre der Antworten auf die Frage profitieren, die Sie verknüpft haben (zumindest wenn OP "inv" für verwendet Lösen von 'x = A^-1 * b'), aber IMO ist dies kein Duplikat. –

Antwort

2

Gleitkommaarithmetik hat:

10+ Die Ziffern nach dem Punktpunkt kann wie folgt verschieden sein eine gewisse Präzision, du kannst dich nicht auf Gleichheit verlassen. Um solche Fehler zu vermeiden, könnten Sie versuchen, mit der symbolischen Toolbox von Matlab zu arbeiten.

Sehr einfache Codezeile in Oktave, die Probleme zu demonstrieren:

>>> (1/48)*48==(1/49)*49 
ans = 0 
>>> (1/48)*48-(1/49)*49 
ans = 1.1102e-16 
>>> 
7

Es scheint mir, wie Sie Ihre eigene Frage im Boden hier beantwortet. Der Grund ist Gleitkommaarithmetik. Die Algortihms für inv() und pinv() sind nicht genau die gleichen, da pinv() in der Lage sein muss, nicht-quadratische Matrizen zu handhaben. Daher werden die Antworten nicht genau übereinstimmen.

Wenn Sie den Wert von pinv(A)*A betrachten, werden Sie sehen, dass es sehr sehr nahe an der Identitätsmatrix ist.

ich:

ans = 

    1.0000e+00 6.1062e-16 -3.0809e-15 
    -5.8877e-15 1.0000e+00 6.3942e-15 
    2.4425e-15 -3.0184e-16 1.0000e+00 

Statt die Matrizen mit == zu vergleichen, < tolerance_limit

c = A*pinv(A); 
d = pinv(A)*A; 

(c-d) < 1e-10 

Nebenbei bemerkt verwenden:

x = A^-1*b sollte nicht x = inv(A)*b; gelöst werden, sondern x = A \ b; See the link Shai posted für Erklärungen.

+0

Was ich sein wollte, ist, dass pinv (A) * A sollte Identitätsmatrix sein, während jetzt die Octave mir diese Antwort nicht geben, weiß ich, warum dieses winzige Ergebnis herauskommt, aber sollten wir nicht immer Matrix Multipy es ist invers Matrix gleich der Identitätsmatrix, genau so, wie Matlab und Freemat es nun tun? – myme5261314

+0

Was gibt Octave dir? Ich schätze ein Ergebnis sehr nah an der Identitätsmatrix (als mein Beispiel). Um zu verstehen, warum das so ist, ist Daniels Antwort ziemlich erklärend. Octave berechnet zunächst die Inverse, multipliziert mit der ursprünglichen Matrix. Wenn Sie etwas völlig anderes bekommen, geben Sie ein Beispiel. –

+0

Ich bekomme die ans-Matrix in Ihrer Antwort ähnlich wie Ihre ans.Was ich meine ist, dass die Oktave als ein Produkt oder als eine Bibliothek sagen sollte, pinv (A) * A = Identitätsmatrix, die Sinn machen, aber jetzt macht die ans-Matrix, die sie zurückgibt, keinen Sinn, und pinv (A) * A entspricht der Identitätsmatrix in Matlab und FreeMat. – myme5261314

13

Diese Frage ist ziemlich alt, aber ich werde es trotzdem beantworten, weil es in einigen Google-Suchen fast oben erscheint.

Ich werde für mein Beispiel die magische (N) Funktion verwenden, die ein N-by-N magisches Quadrat zurückgibt.

Ich werde ein magisches 3x3-Quadrat M3 schaffen, nehmen Sie die Pseudo-Inverse PI_M3 und mehren:

 prompt_$ M3 = magic(3) , PI_M3 = pinv(M3) , M3 * PI_M3
 
    M3 = 

    8 1 6 
    3 5 7 
    4 9 2 

    PI_M3 = 

    0.147222 -0.144444 0.063889 
    -0.061111 0.022222 0.105556 
    -0.019444 0.188889 -0.102778 

    ans = 

    1.0000e+00 -1.2212e-14 6.3283e-15 
    5.5511e-17 1.0000e+00 -2.2204e-16 
    -5.9952e-15 1.2268e-14 1.0000e+00 

Wie Sie die Antwort sehen die Identitätsmatrix ist für einige Rundungsfehler speichern. Ich werde den Betrieb mit einem 4x4 magischen Quadrat wiederholen:

 prompt_$ M4 = magic(4) , PI_M4 = pinv(M4) , M4 * PI_M4
 
    M4 = 

    16 2 3 13 
     5 11 10 8 
     9 7 6 12 
     4 14 15 1 

    PI_M4 = 

    0.1011029 -0.0738971 -0.0613971 0.0636029 
    -0.0363971 0.0386029 0.0261029 0.0011029 
    0.0136029 -0.0113971 -0.0238971 0.0511029 
    -0.0488971 0.0761029 0.0886029 -0.0863971 

    ans = 

    0.950000 -0.150000 0.150000 0.050000 
    -0.150000 0.550000 0.450000 0.150000 
    0.150000 0.450000 0.550000 -0.150000 
    0.050000 0.150000 -0.150000 0.950000 

Das Ergebnis ist nicht die Identitätsmatrix, bedeutet dies, dass das 4x4 magische Quadrat nicht einen inverses hat. Ich kann dies überprüfen, indem eine der Regeln des Penrose-Pseudo Moore versucht:

 prompt_$ M4 * PI_M4 * M4
 
ans = 

    16.00000 2.00000 3.00000 13.00000 
    5.00000 11.00000 10.00000 8.00000 
    9.00000 7.00000 6.00000 12.00000 
    4.00000 14.00000 15.00000 1.00000 

Die Regel A * B * A = A erfüllt ist. Dies zeigt, dass pinv die inverse Matrix zurückgibt, wenn sie verfügbar ist und die Pseudoinverse, wenn die inverse nicht verfügbar ist. Dies ist der Grund, warum Sie in manchen Situationen einen kleinen Unterschied haben, nur einige Rundungsfehler, und in anderen Situationen bekommen Sie einen größeren Unterschied. es zu zeigen, werde ich die Umkehrung der beiden magischen Quadranten erhalten und sie von der Pseudo-Inverse subtrahieren: [? Warum ist Matlab inv langsam und ungenau]

 prompt_$ I_M3 = inv(M3) , I_M4 = inv(M4) , DIFF_M3 = PI_M3 - I_M3, DIFF_M4 = PI_M4 - I_M4
 
    I_M3 = 

    0.147222 -0.144444 0.063889 
    -0.061111 0.022222 0.105556 
    -0.019444 0.188889 -0.102778 

    warning: inverse: matrix singular to machine precision, rcond = 1.30614e-17 
    I_M4 = 

    9.3825e+13 2.8147e+14 -2.8147e+14 -9.3825e+13 
    2.8147e+14 8.4442e+14 -8.4442e+14 -2.8147e+14 
    -2.8147e+14 -8.4442e+14 8.4442e+14 2.8147e+14 
    -9.3825e+13 -2.8147e+14 2.8147e+14 9.3825e+13 

    DIFF_M3 = 

    4.7184e-16 -1.0270e-15 5.5511e-16 
    -9.9226e-16 2.0470e-15 -1.0825e-15 
    5.2042e-16 -1.0270e-15 4.9960e-16 

    DIFF_M4 = 

    -9.3825e+13 -2.8147e+14 2.8147e+14 9.3825e+13 
    -2.8147e+14 -8.4442e+14 8.4442e+14 2.8147e+14 
    2.8147e+14 8.4442e+14 -8.4442e+14 -2.8147e+14 
    9.3825e+13 2.8147e+14 -2.8147e+14 -9.3825e+13