10

Zauważyłem, że jeśli A jest macierzą NxN i ma macierz odwrotną. Ale czym różnią się wyniki funkcji inv() i pinv(). - Moje środowisko jest Win7x64 SP1, Matlab R2012a, Cygwin Octave 3.6.4, FreeMat 4,2Dlaczego dane wyjściowe inv() i pinv() nie są równe w Matlab i Octave?

Czy spojrzenie na przykładach z oktawy:

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 
  • To wszystko jest takie same ans wynik uruchamiając to samo polecenie powyżej w Matlab.

  • I obliczyć inv(A)*A lub A*inv(A), wynik jest tożsamość macierz 3x3 zarówno Octave i Matlab.
  • Wynik A*pinv(A) i pinv(A)*A to macierz tożsamości 3x3 w Matlab i FreeMacie.
  • Wynikiem A*pinv(A) jest macierz tożsamości 3x3 w Octave.
  • Wynik pinv(A)*A jest nie tożsamość macierz 3x3 w oktawie.

nie wiem dlaczego inv(A) != pinv(A), Rozważałam szczegóły elementu w macierzy. Wydaje się, że problem z pływającą dokładnością powoduje ten problem.

10+ cyfry po punktowym może być różny tak:

  • 6.65858991579923298331777914427220821380615200000000 element inv(A)(1,1) na

  • 6.65858991579923209513935944414697587490081800000000 element pinv(A)(1,1)

+0

możliwe duplikat (http: // stackoverflow. com/questions/1419580/why-is-matlabs-inv-slow-and-niedokładne) – Shai

+0

@Shai, wierzę, że OP może skorzystać na przeczytaniu odpowiedzi na pytanie, z którym się łączyłeś (przynajmniej jeśli OP używa 'inv' dla rozwiązywanie 'x = A^-1 * b'), ale IMO to nie jest duplikat. –

Odpowiedz

2

pływający arytmetyka jest pewna precyzja, nie można polegać na równości. Aby uniknąć takich błędów, możesz spróbować pracować z symbolicznym zestawem narzędzi Matlaba.

Bardzo prosty wiersz kodu w oktawie wykazać problemy:

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

Wydaje mi się, jak odpowiedziałeś na swoje pytanie w dolnej tutaj. Powodem jest arytmetyka zmiennoprzecinkowa. Algortihms dla inv() i pinv() nie są dokładnie takie same, ponieważ pinv() musi być w stanie obsłużyć macierze inne niż kwadratowe. Dlatego odpowiedzi nie będą dokładnie takie same.

Jeśli spojrzysz na wartość pinv(A)*A, zobaczysz, że jest bardzo bardzo blisko macierzy tożsamości.

uzyskać:

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 

Zamiast porównywać macierze z == użyć < tolerance_limit

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

(c-d) < 1e-10 

Sidenote:

x = A^-1*b nie powinny być rozwiązywane x = inv(A)*b;, ale raczej x = A \ b; Zobacz the link Shai posted dla wyjaśnienia.

+0

Chciałem być tym, że pinv (A) * A powinien być matrycą tożsamości, podczas gdy teraz Oktawa nie daje mi tej odpowiedzi, wiem, dlaczego ten drobny wynik wypada, ale nie powinniśmy zawsze uzyskiwać macierz wielowątkowość jest odwrotna macierz równa macierzy tożsamości tak jak teraz Matlab i Freemat? – myme5261314

+0

Co daje Octave? Myślę, że wynik jest bardzo bliski macierzy tożsamości (jak mój przykład). Aby zrozumieć, dlaczego tak jest, odpowiedź Daniela jest dość objaśniająca. Oktawa najpierw oblicza odwrotność niż mnoży z oryginalną macierzą. Jeśli otrzymasz coś zupełnie innego, podaj przykład. –

+0

Dostaję macierz ans podobną do twoich ans w twojej odpowiedzi.Mam na myśli to, że jako produkt lub powiedzieć jako biblioteka, Oktawa powinna dać pinv (A) * A = matrycę tożsamości, która ma sens, ale teraz macierz ans, która powraca, nie ma sensu, a pinv (A) * A równa się macierzy tożsamości w Matlabie i FreeMacie. – myme5261314

13

To pytanie jest dość stare, ale mimo to odpowiem na nie, ponieważ pojawia się prawie na górze w niektórych wyszukiwaniach w Google.

Użyję dla mojego przykładu magicznej (N) funkcji, która zwraca magiczny kwadrat N-by-N.

będę stworzyć magiczny kwadrat 3x3 M3, podejmują pseudoinverse PI_M3 i pomnożyć je:

 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 

Jak widać odpowiedź jest macierzą jednostkową za wyjątkiem niektórych błędów zaokrągleń. będę powtórzyć operację z magicznym kwadracie 4x4:

 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 

Wynik nie jest macierzą jednostkową, to znaczy, że kwadrat 4x4 magia nie ma odwrotność. mogę to sprawdzić próbując jednego z regułami pseudoinverse Moore-Penrose'a:

 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 

Reguła A * B * A = A jest spełnione. To pokazuje, że pinv zwraca macierz odwrotną, gdy jest dostępna, i pseudo-odwrotność, gdy odwrotność nie jest dostępna. Z tego powodu w niektórych sytuacjach uzyskujesz niewielką różnicę, tylko niektóre błędy zaokrągleń, aw innych sytuacjach masz większą różnicę. Aby pokazać go dostanę odwrotność obu magicznych kwadrantach i odjąć je od pseudoinverse [? Dlaczego jest inv MATLAB jest powolne i niedokładne]

 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