2014/05/25(日)Perl Data Language 基礎編 #02 「行列の演算とバッド値」

PDLの関数を見る前に行列の演算です。

ドキュメントは以下の通り。

  • PDL::Core(メソッド、型変換のための関数、PDLの生成、型変換、スレッドなど)
  • PDL::BadValues(PDLにおけるバッド値サポートの議論)

バッド値は欠損値に使うのが良さそう。バッド値があるとバッドフラグがついて、さらにバッドフラグがついたピドル(PDLの変数のこと)で演算したりするとバッドフラグが伝染するみたい。ちなみに他の文字列(nyan)はバッド値がつくのか疑問に思ったので試したけど、ちゃんと'bad'や'BAD'と区別してバッドフラグはつかないようになっている模様。

他の注意点は行列同士の積は「x」を使うことぐらい。

統計についてまとめていく前にコア関数をまとめて、主要なドキュメントをまとめて、グラフ描画についてまとめます。

#!/usr/bin/env perl

use strict;
use warnings;
use feature qw/say/;
use PDL;
use DDP filters => { -external => [ 'PDL' ] };

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

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

say "$a: $a";
say "$b: $b";

say "$a x $b";
say $a x $b; # 行列の積は*でなくてxを使う

my $d = $a;
$d = $d ** 3; # 3乗

say "$d($a^3): $d";
say "$a: $a"; # $a には影響しない

my $e = pdl [
    [ 'inf',    2    ],
    [ 'nan', ' -inf' ]
];

my $f = pdl [
    [ '-inf',  'bad'   ],
    [  3    ,  'nyan' ]
];

say "$e: $e";
say "$f: $f";

say "$e + $f:";
say $e + $f;

say "バッドフラグ";
say PDL->new(3)->badflag;
say PDL->new('bad')->badflag;
eval { PDL->new('nyan')->badflag; };
print $@ if $@;
my $g = pdl [ 'nyan' ];
say $g->badflag;
say p $g;

実行結果↓

$a: 
[
 [1 2]
 [3 4]
]

$b: 
[
 [5]
 [6]
]

$a x $b

[
 [17]
 [39]
]

$d($a^3): 
[
 [ 1  8]
 [27 64]
]

$a: 
[
 [1 2]
 [3 4]
]

$e: 
[
 [ inf    2]
 [ nan -inf]
]

$f: 
[
 [-inf    0]
 [   3    0]
]

$e + $f:

[
 [-nan    2]
 [ nan -inf]
]

バッドフラグ
0
1
PDL::Core::new_pdl_from_string: found disallowed character(s) 'nyan' in nyan at core.pl line 50.
0
PDL {
    Data     : [0]
    Type     : double
    Shape    : [1]
    Nelem    : 1
    Min      : 0
    Max      : 0
    Badflag  : No
    Has Bads : No
}