PDLで逆行列を求める

行列を扱うには、PDL::Matrixを使う必要がある。
詳しくは、PDL::MatrixPDL::MatrixOpsを見ると良いかも。

3×3の単位行列はこんな感じで宣言する。

use strict;
use warnings;
use v5.10;

use PDL;
use PDL::Matrix;

my $a = mpdl( [1,0,0], [0,1,0], [0,0,1] );
say $a;

my $b = identity( 3, 3 );
say $b;

実行結果はこの通り。
$ perl aaa.pl

[
[1 0 0]
[0 1 0]
[0 0 1]
]

[
[1 0 0]
[0 1 0]
[0 0 1]
]

逆行列の計算はこんな感じ。

use strict;
use warnings;
use v5.10;

use PDL;
use PDL::Matrix;

my $a = mpdl( [2,2,0], [0,2,0], [0,2,2] );
say $a;

my $b = inv $a;
say $b;

結果はこんな感じ。
$ perl bbb.pl

[
[2 2 0]
[0 2 0]
[0 2 2]
]

[
[ 0.5 0 0]
[-0.5 0.5 -0.5]
[ 0 0 0.5]
]

最後に行列の積について。

use strict;
use warnings;
use v5.10;
use utf8;

use PDL;
use PDL::Matrix;

my $a = mpdl( [2,2,0], [0,2,0], [0,2,2] );
my $b = inv $a;

# 同じ位置の要素を掛け算しただけ
say '# $a * $b', $a * $b;

# 行列の積は'x'を使う
say '# $a x $b', $a x $b;

ポイントは演算子で、'*'じゃなくて'x'を使っているところ。
$ perl ccc.pl
# $a * $b
[
[ 1 -1 0]
[ 0 1 0]
[ 0 -1 1]
]

# $a x $b
[
[1 0 0]
[0 1 0]
[0 0 1]
]

おしまい。

Leave a Comment