[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]重み付き非線形最小二乗法を行う(2026.03.22)
- [Octave]重み付き非線形最小二乗法を行う(2026.03.17)
- [Octave]計算機イプシロンを求める(2026.03.16)
- [Octave]正規分布におけるp値(2023.04.21)
- [Octave]正規分布におけるパーセント点(2023.04.18)

コメント