とある本で行列の積の定義があって、例としてつぎのような行列A、Bの積を行っていました。
B 0 3 1 4 2 5 A 6 8 7 9 B mp A 21 27 34 44 47 61
さて、通常J言語で3x2(3行2列)の行列を作ろうと思うと、次のようにします。
i.3 2 0 1 2 3 4 5
これが例のBと微妙に違います。Bは数字を縦に並べているのですが、i.3 2はそのままだと横に並べます。これをBのようにするために、方法はいくつかあると思いますが|:(トランスポーズ、たてよこ変換)を使いました。
|:i.3 2 0 2 4 1 3 5 |:i.2 3 0 3 1 4 2 5
行列の積は次のように定義します。
mp=:+/ . *
これは定義しないで、(+/ . *)のようにそのまま使ってもいいです。mpはmatrix productの意味で行列積のことです。
A mp BでなくB mp Aなのが不思議です。右の行列に左の行列を掛けるという感覚でしょうか。
Aは2 x 2の行列なので次のように作ります。
]A=:|:(>:^:6) i.2 2 6 8 7 9
インクリメント(>:)を6回繰り返しています。しかし、単純に6を足す方が自然かもしれません。
]A=:|:(6&+) i.2 2 6 8 7 9
これで材料がそろいました。
B mp A 21 27 34 44 47 61 (|:i.2 3) mp (|:(6&+)i.2 2) 21 27 34 44 47 61
手でやるのが厄介な行列の積をこうして簡単にできるようになると、いろいろ実験したくなります。
3 3$1 1 1 1 1 1 1 1 1 1 (3 3$1) mp (3 3$1) 3 3 3 3 3 3 3 3 3 3 3$1 0 0 0 1 0 0 0 1 0 0 0 1 (3 3$1 0 0 0) mp (3 3$1 0 0 0) 1 0 0 0 1 0 0 0 1 (i.3 3) mp (3 3$1 0 0 0) 0 1 2 3 4 5 6 7 8 (i.3 3) mp (3 3$1) 3 3 3 12 12 12 21 21 21
アイデア:小学生の算数の勉強法に公文式(くもん式)というのがあります。単純な計算をたくさん繰り返すやつですね。あと頭の体操系のゲームや本にも計算を繰り返すものがあります。あれはあれでよいのですが、数列などはめんどくさすぎるので入っていない。コンピュータ言語を使って今回の行列の積のようなもののためし計算をいろいろするというのはどうでしょうか? 新しい発見があるかもしれない。
アイデア:行列の積の結果の行列を与えられて、もとの行列を推測できるか? 結果だけからだと難しいが、たとえば正方行列に限定するとか、今回の例で言えば2 x 2の行列に3 x 2の行列をかけたもの、とか条件を与えられればできるだろうか? 少なくとも結果とAもしくはBのどちらかを与えられればできると思うが、やってみよう。
C=:B mp A B mp^:_1 C
length error |
B mp^:_1 C |
]A =:i.3 3 0 1 2 3 4 5 6 7 8 ]C=:A mp A 15 18 21 42 54 66 69 90 111 A mp^:_1 C
domain error |
A mp^:_1 C |
]A=:i.2 2 0 1 2 3 ]C=:A mp A 2 3 6 11 A mp^:_1 C 0 1 2 33 x 3行列と2 x 2行列のどこが違うのだろうと思って、色々調べたらたまたまなのかもしれませんが、逆行列があるかないかの違いかもしれないと思いつきました。
%.i.2 2 _1.5 0.5 1 0 %.i.3 3
domain error |
%.i.3 3 |
det=:-/ . * det i.2 2 _2 det i.3 3 0さてdeterminantが0でない3 x 3行列を適当に作ってみます。
]A =: 3 3$1 2 3 4 5 6 8 2 1 9 1 2 3 4 5 6 8 2 1 det A _15 ]C =: A mp A 33 18 18 72 45 48 24 28 37 A mp^:_1 C 1 2 3 4 5 6 8 2 1成功!