RubyのMatrixクラスで遊ぶ
ここのところ画像処理について勉強する機会があって、線形代数の偉大さを身をもって感じている。
そりゃ位相・集合論とか抽象代数とは比べ物にならないほど応用範囲が広いことは分かっていたけれども、
行列の固有値を求める方法が顔認識システムで活躍しているなんて思ってもみなかった。
線形代数は学部の頃に独学で勉強したきりで、大半の知識は忘却の彼方にある。
復習のため線形代数の教科書を開いたはいいが、紙とペンで一から復習するのはしんどいので、手始めにRubyのMatrixクラスで勘所をつかむことにした。
require "matrix" r1 = [1,-1,-1] r2 = [-1,1,-1] r3 = [-1,-1,1] m1 = Matrix.rows([r1,r2,r3]) # => Matrix[[1, -1, -1], [-1, 1, -1], [-1, -1, 1]] m1.det # => -4 m1.inverse # => Matrix[[(0/1), (-1/2), (-1/2)], [(-1/2), (0/1), (-1/2)], [(-1/2), (-1/2), (0/1)]] m1 * m1.inverse # => Matrix[[(1/1), (0/1), (0/1)], [(0/1), (1/1), (0/1)], [(0/1), (0/1), (1/1)]] m1.rank # => 3 m1.trace # => 3 m1.transpose # => Matrix[[1, -1, -1], [-1, 1, -1], [-1, -1, 1]] m1.square? # => true m1.singular? # => false m1.regular? # => true e = Matrix.unit(3) # => Matrix[[1, 0, 0], [0, 1, 0], [0, 0, 1]] m2 = Matrix.columns([[3,4,5]]) # => Matrix[[3], [4], [5]] m1 * m2 # => Matrix[[-6], [-4], [-2]]
Rubyの式の評価結果をコメントに吐き出してくれるxmp filterを今回初めて使ってみたのだけど、irbで式の結果を確認するより遥かに使い勝手がいい。
ソースを貼り付けるのもとっても楽だ。
さて固有値と固有ベクトルを求めるメソッドをMatrixクラスに追加したいなあ、と思うんだけど、どうやって定義したらいいだろう。
追記:
Matrixクラスを拡張して固有値とか固有ベクトルを求めるメソッドを追加したものが Githubに置いてあった。
clbustos/extendmatrix · GitHub
こんど試してみよう。