15

A が NxN 行列で、逆行列があることに気付きました。しかし、inv() と pinv() 関数の出力は異なります。- 私の環境は Win7x64 SP1、Matlab R2012a、Cygwin Octave 3.6.4、FreeMat 4.2 です。

Octave の例を見てみましょう。

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)*Aorを計算するA*inv(A)と、結果は Octave と Matlab の両方で単位 3x3 行列になります。
  • との結果はA*pinv(A)pinv(A)*AMatlab と FreeMat の恒等 3x3 行列です。
  • の結果はA*pinv(A)、Octave の恒等 3x3 行列です。
  • の結果は、Octave の恒等 3x3 行列でpinv(A)*Aはありません。

理由はわかりませんがinv(A) != pinv(A)、マトリックス内の要素の詳細を検討しました。この問題を引き起こすのは、浮動精度の問題のようです。

ドット ポイントの後の 10 桁以上は、次のように異なる場合があります。

  • 6.65858991579923298331777914427220821380615200000000inv(A)(1,1)反対の要素

  • 6.65858991579923209513935944414697587490081800000000の要素pinv(A)(1,1)

4

4 に答える 4

16

この質問はかなり古いですが、一部の Google 検索でほぼトップに表示されるため、とにかく答えます。

この例では、N 行 N 列の魔方陣を返す magic(N) 関数を使用します。

3x3 の魔方陣 M3 を作成し、疑似逆数 PI_M3 を取り、それらを乗算します。

   prompt_$ M3 = マジック(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 = マジック(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 の魔方陣には逆行列がありません。これは、Moore-Penrose 疑似逆行列のルールの 1 つを試すことで確認できます。

   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 が逆行列が利用できる場合は逆行列を返し、逆行列が利用できない場合は疑似逆行列を返すことを示しています。これが、いくつかの状況ではわずかな丸め誤差だけが得られる理由であり、別の状況では大きな差が得られる理由です。それを示すために、両方の魔法の象限の逆を取得し、疑似逆からそれらを減算します。

   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

  警告: 逆: 機械精度に特異な行列、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
于 2015-08-10T13:41:00.660 に答える