10

我注意到,如果A是一個N×N矩陣並且它有逆矩陣。但是,inv()和pinv()函數的輸出是不同的。 - 我的環境是Win7x64 SP1,MATLAB R2012a,Cygwin的倍頻3.6.4,FreeMat 4.2爲什麼在Matlab和Octave中inv()和pinv()的輸出不相等?

看看例子從八度:

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 
  • 這一切都同ans結果通過運行在Matlab中同樣的命令。

  • 我計算inv(A)*AA*inv(A)或,結果是在兩個八度和Matlab身份3×3矩陣。
  • A*pinv(A)pinv(A)*A的結果是Matlab和FreeMat中的標識3x3矩陣。
  • A*pinv(A)的結果是Octave中的恆等式3x3矩陣。
  • pinv(A)*A的結果是而不是在Octave中的身份3x3矩陣。

我不知道爲什麼inv(A) != pinv(A),我也考慮過在矩陣元素的細節的原因。這似乎是導致此問題的浮動精度問題。

點點後的數字10+可以是這樣的不同:

  • 6.65858991579923298331777914427220821380615200000000元件在inv(A)(1,1)針對

  • 6.65858991579923209513935944414697587490081800000000元件在pinv(A)(1,1)

+0

的可能重複(HTTP://計算器。 com/questions/1419580/why-is-matlabs-inv-slow-and-accurate) – Shai

+0

@Shai,我相信OP可能從閱讀你鏈接到的問題的答案中受益(至少如果OP使用'inv'解決'x = A^-1 * b'),但IMO不是重複的。 –

回答

2

浮點算術具有有一定的精確度,你不能依靠平等。爲了避免這種錯誤,你可以嘗試使用matlab的符號工具箱。

很簡單的倍頻行代碼來演示問題:

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

在我看來,像你在底部回答了你自己的問題在這裏。原因是浮點運算。 inv()pinv()的algortihms不完全相同,因爲pinv()必須能夠處理非方形矩陣。因此答案不會完全一樣。

如果您查看pinv(A)*A的值,您會看到它非常接近單位矩陣。

我得到:

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 

取而代之的是矩陣與==比較,使用< tolerance_limit

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

(c-d) < 1e-10 

旁註:

x = A^-1*b不應該被解決x = inv(A)*b;,而是x = A \ b;the link Shai posted的解釋。

+0

我的意思是,pinv(A)* A應該是單位矩陣,而現在八度並不給我這個答案,我知道爲什麼這個微小的結果出來了,但是不應該總是得到矩陣乘它是相反的矩陣等於單位矩陣,就像Matlab和Freemat現在正在做的一樣? – myme5261314

+0

Octave給你什麼?我猜想結果很接近身份矩陣(就像我的例子)。爲了理解這是爲什麼,Daniel的答案很有說服力。 Octave首先計算反比與原始矩陣相乘。如果你有完全不同的東西,請舉個例子。 –

+0

我在你的答案中得到了與你的ans類似的ans矩陣。我的意思是作爲一個產品或者說作爲一個圖書館,Octave應該讓pinv(A)* A =有意義的單位矩陣,但是現在它返回的ans矩陣是沒有意義的,並且pinv(A) * A等於Matlab和FreeMat中的單位矩陣。 – myme5261314

13

這個問題是相當古老的,但我會回答它,因爲它幾乎出現在谷歌搜索的頂部。

我將用我的例子來說明魔術(N)函數,它返回一個N乘N的魔方。

我將創建一個3x3的幻方M3,採取僞逆PI_M3和繁殖他們:

 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 

正如你所看到的答案是單位矩陣除了一些舍入誤差。 我會重複操作與一個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 

結果不是單位矩陣,這意味着4x4的幻方不具有逆。 我可以嘗試的摩爾 - 彭羅斯僞逆的規則之一驗證這一點:

 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 

規則A * B * A = A是滿意的。這表明pinv在可用時返回逆矩陣,在逆不可用時返回僞逆。這就是爲什麼在某些情況下,你會得到一個小小的差異,只是一些舍入誤差,而在其他情況下,你會得到更大的差異。 要顯示它,我會得到兩個魔法象限的逆和僞逆減去他們:爲什麼是Matlab的INV緩慢和不準確的]

 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 
相關問題