行列の扱い

普通の計算をする場合行列は多次元配列で扱えば良いが、例えば逆行列を求めるときなどはモジュールを使うのが早い。行列は"Math::MatrixReal"にて扱える。Math::MatrixRealのインストール方法はcpanmのインストールおよびcpanmの使い方を参照。MatrixRealでは行列はスカラーとして扱う (行列を代入する変数のシジルは"$")。

まずは、多次元配列@matrixからMatrixRealを使って行列"$matrix"を作成する。

#!/usr/bin/perl
use strict;
use warnings;
use Math::MatrixReal;

my @matrix;
my $k=1;
for(my $i=0;$i<3;$i++)
{
	for(my $j=0;$j<3;$j++)
	{
		$matrix[$i][$j]=$k;
		$k++;
	}
}

my $matrix=Math::MatrixReal->new_from_rows(\@matrix);

print $matrix;

真ん中のforは@matrixを作成するための繰り返しであり、3x3の多次元行列ができる。その行列を黄色で示した文で$matrixに格納した。リファレンスを使う。以上のファイルを"hoge.pl"として保存し、実行すると以下のようになる。

1|$./hoge.pl
[ 1.000000000000E+00 4.000000000000E+00 9.000000000000E+00 ]
[ 1.600000000000E+01 2.500000000000E+01 3.600000000000E+01 ]
[ 4.900000000000E+01 6.400000000000E+01 8.100000000000E+01 ]

次に、逆行列を作成するには以下のようにする。$matrixから"$inverse"を作成する。

#!/usr/bin/perl
use strict;
use warnings;
use Math::MatrixReal;

my @matrix;
my $k=1;
for(my $i=0;$i<3;$i++)
{
	for(my $j=0;$j<3;$j++)
	{
		$matrix[$i][$j]=$k**2;
		$k++;
	}
}

my $matrix=Math::MatrixReal->new_from_rows(\@matrix);

my $inverse=$matrix->inverse;

print $inverse;

上で作成した$matrixから逆行列$inverseを作成した。このファイル"hoge.pl"を実行すると以下のようになる。

1|$./hoge.pl
[ 1.291666666667E+00 -1.166666666667E+00 3.750000000000E-01 ]
[ -2.16666666667E+00 1.666666666667E+00 -5.000000000000E-01 ]
[ 9.305555555556E-01 -6.111111111111E-01 1.805555555556E-01 ]

行列の要素を取り出すときは"element"を使い、以下のようにする。

#!/usr/bin/perl
use strict;
use warnings;
use Math::MatrixReal;

my @matrix;
my $k=1;
for(my $i=0;$i<3;$i++)
{
	for(my $j=0;$j<3;$j++)
	{
		$matrix[$i][$j]=$k**2;
		$k++;
	}
}

my $matrix=Math::MatrixReal->new_from_rows(\@matrix);

my $inverse=$matrix->inverse;

print $inverse->element(1,1),"\n";

このファイル"hoge.pl"を実行すると以下のようになる。

1|$./hoge.pl
1.291666666667

足し算、掛け算、引き算、累乗もできる。割り算はできない。使い方は以下のようになる。$new1は足し算、$new2は掛け算、$new3は引き算、$new4は要素の定数倍、$new5は累乗の結果を示す。累乗は整数であることが求められる。この方法では行列の平方根は求まらない。

#!/usr/bin/perl
use strict;
use warnings;
use Math::MatrixReal;

my @matrix;
my $k=1;
for(my $i=0;$i<3;$i++)
{
	for(my $j=0;$j<3;$j++)
	{
		$matrix[$i][$j]=$k**2;
		$k++;
	}
}

my $matrix=Math::MatrixReal->new_from_rows(\@matrix);

my $inverse=$matrix->inverse;

my $new1=$matrix+$inverse;
my $new2=$matrix*$inverse;
my $new3=$matrix-$inverse;
my $new4=$matrix*5;
my $new5=$matrix**5;

print $new2;

実行すると以下のようになる。"$new2"は行列"$matrix"とその逆行列"$inverse"の積なので、結果は確かに単位行列になっている。1行目の2,3列目の値は計算誤差 (-16乗のオーダー)である。

1|$./hoge.pl
[ 1.000000000000E+00 8.881784197001E-16 2.220446049250E-16 ]
[ 0.000000000000E+00 1.000000000000E+00 0.000000000000E+00 ]
[ 0.000000000000E+00 0.000000000000E+00 1.000000000000E+00 ]
このエントリーをはてなブックマークに追加

Site search

ページのトップへ戻る