Perl入門ゼミ

テキスト処理、Linuxサーバー管理、Web開発ならPerl
  1. Perl
  2. モジュール
  3. PDL

PDLにおける「行列」の扱い

PDLにおける「行列」の扱いを解説します。

行列の作成

行列を作成するにはpdl関数を使用します。

use PDL;

my $mat = mpdl [
  [1, 2],
  [3, 4]
];

以下のような行列が作成されます。

[
 [1 2]
 [3 4]
]

行列の足し算

行列の足し算を行うには+演算子を使用します。

use PDL;

my $mat1 = pdl [
  [1, 2],
  [3, 4]
];
my $mat2 = pdl [
  [5, 6],
  [7, 8]
];

my $mat_sum = $mat1 + $mat2;

各要素が足されて以下のような結果になります。

[
 [ 6  8]
 [10 12]
]

行列の引き算

行列の足し算を行うには-演算子を使用します。

use PDL;

my $mat1 = pdl [
  [1, 2],
  [3, 4]
];

my $mat2 = pdl [
  [5, 6],
  [7, 8]
];

my $mat_sub = $mat2 - $mat1;

各要素が引かれて以下のような結果になります。

[
 [4 4]
 [4 4]
]

行列の積

行列の積を求めるにはx演算子を使用します。

use PDL;

my $mat1 = pdl [
  [1, 2],
  [3, 4]
];
my $mat2 = pdl [
  [5, 6],
  [7, 8]
];

my $mat_multi = $mat1 x $mat2;

計算された結果は以下のようになります。

[
 [19 22]
 [43 50]
]

行列の要素を取得する

行列の要素を取得するにはatメソッドを使用します。行と列の順番が、通常の行列と異なること、添え字は0から始まることに注意しましょう。

$matrix->at(列, 行)

以下は2×2行列の、2行1列目の値(3)を取得するサンプルです。

use PDL;

my $mat = pdl [
  [1, 2],
  [3, 4]
];
my $val = $mat->at(0, 1);

行列の要素を設定する

行列の要素を設定するにはナイススライスという記法を利用します。ナイススライス記法を使うためにはPDL::NiceSliceモジュールを読み込む必要があります。

use PDL;
use PDL::NiceSlice;

$matrix(列, 行) .= 値

この記法は変数の後ろに括弧が付くという少し特殊な用法です。また.=文字列連結演算とイコールの組み合わせは、値の代入のためにオーバーロードされています。

以下は2×2行列の、2行1列目の値を5に設定するサンプルです。添え字は0から始まることに注意してください。

use PDL;
use PDL::NiceSlice;

my $mat = pdl [
  [1, 2],
  [3, 4]
];
$mat(0, 1) .= 5;

この変数の出力結果は以下のようになります。

[
 [1 2]
 [5 4]
]

単位行列を作成する

単位行列を作成してみましょう。3×3の単位行列にしてみます。手順はPDL::Corezeroes関数ですべての要素が0の3×3の正方行列を作成します。それから、diagonalメソッドで対角をスライスして1を代入します。引数の(0, 1)は、1次元と2次元という意味です。1次元と2次元の対角を取得という意味になります。

use PDL;

my $mat = PDL::Core::zeroes(3, 3);
$mat->diagonal(0, 1) .= 1;

出力結果は以下のようになります。

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

行列式を求める

行列式を求めるにはdetメソッドを使用します。

use PDL;

my $mat = pdl [
  [1, 2],
  [3, 4]
];

my $det = $mat->det;

行列式の値は以下のようになります。

-2

逆行列を求める

逆行列を求めるにはinv関数を使用します。

use PDL;

my $mat = pdl [1, 2], [3, 4];

my $mat_inv = inv $mat;

計算された結果は以下のようになります。

[
 [  -2    1]
 [ 1.5 -0.5]
]

ベクトル(列ベクトル)を作成する

ベクトル(列ベクトル)を作成するには次のようにします。

use PDL;

my $vec = pdl [
  [1],
  [2]
];

データの出力結果は以下のようになります。

[
 [1]
 [2]
]

一次変換を計算する

一次変換を計算してみましょう。正方行列 × 列ベクトルの演算です。

use PDL;

my $mat = pdl [
  [1, 2],
  [3, 4]
];

my $vec = pdl [
  [5],
  [6]
];

my $result = $mat x $vec;

結果の出力結果は以下のようになります。

[
 [17]
 [39]
]

t[5, 6]は[ [1, 2], [3,4] ]という2×2行列によってt[17, 39]に変換されました。(tは転置という意味)