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
możliwe duplikat (http: // stackoverflow. com/questions/1419580/why-is-matlabs-inv-slow-and-niedokładne) – Shai
@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. –