« [Octave]逆行列を求める | トップページ | [Python]行列式を求める »

2023年3月13日 (月)

[Octave]一般逆行列を求める

pinv関数を使う。

>> mx = [1 2 3 4; 5 6 7 8; 9 10 11 12; 13 14 15 16]
mx =
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
>> det(mx)
ans = 0
>> inv(mx)
warning: matrix singular to machine precision
ans =
Inf Inf Inf Inf
Inf Inf Inf Inf
Inf Inf Inf Inf
Inf Inf Inf Inf
>> pinv(mx)
ans =
-2.8500e-01 -1.4500e-01 -5.0000e-03 1.3500e-01
-1.0750e-01 -5.2500e-02 2.5000e-03 5.7500e-02
7.0000e-02 4.0000e-02 1.0000e-02 -2.0000e-02
2.4750e-01 1.3250e-01 1.7500e-02 -9.7500e-02
>> mxi = pinv(mx);
>> mx * mxi * mx
ans =
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16

当然、正方行列でなくとも求めることができる。

>> mx = [1 2 3 4; 5 6 7 8]
mx =
1 2 3 4
5 6 7 8
>> det(mx)
error: det: A must be a square matrix
>> inv(mx)
error: inverse: A must be a square matrix
>> pinv(mx)
ans =
-5.5000e-01 2.5000e-01
-2.2500e-01 1.2500e-01
1.0000e-01 -2.3434e-17
4.2500e-01 -1.2500e-01
>> mxi = pinv(mx)
mxi =
-5.5000e-01 2.5000e-01
-2.2500e-01 1.2500e-01
1.0000e-01 -2.3434e-17
4.2500e-01 -1.2500e-01
>> mx * mxi * mx
ans =
1 2 3 4
5 6 7 8

pinv関数はムーア・ペンローズ一般逆行列を数値的に求める関数のため、求まった一般逆行列は近似値であることに注意。ムーア・ペンローズ一般逆行列の定義の4つの式について、比較をした例は以下のとおり。すべての要素が1にならないことがわかる。

>> mx * mxi * mx == mx
ans =
0 0 0 0
0 0 0 0
>> mxi * mx * mxi == mxi
ans =
1 1
1 0
0 0
0 0
>> (mx * mxi).' == mx * mxi
ans =
1 0
0 1
>> (mxi * mx).' == mxi * mx
ans =
1 1 0 0
1 1 0 0
0 0 1 0
0 0 0 1

« [Octave]逆行列を求める | トップページ | [Python]行列式を求める »

Octave」カテゴリの記事

コメント

コメントを書く

コメントは記事投稿者が公開するまで表示されません。

(ウェブ上には掲載しません)

« [Octave]逆行列を求める | トップページ | [Python]行列式を求める »

無料ブログはココログ

■■

■■■