Matrix(行列)って何?
Matrix(行列)は、同じ長さの配列を配列の中に入れたような形式のデータで、下記のような形のものを言います。
Matrix[
[1,2,1,1],
[2,4,5,2],
[1,4,4,4],
[5,4,1,1],
[2,3,3,4]
]
具体的なデータ例
・本の購入履歴データ
・各ユーザーの映画の評価データ
など
ユーザーをu1,u2,u3として、映画をm1,m2,m3としたときの評価データは、
m1 m2 m3
u1 0 3 1
u2 1 5 2
u3 5 0 0
みたいな形で表すことができて、これをMatrix(行列)といい、様々な計算をしていきます。
Rubyの弱点の一つだったMatrix
Rubyは標準でmatrixライブラリを用意していたものの、使いづらいしパフォーマンスがひどかった。
理由はこの投稿を見れば分かります。
http://qiita.com/catatsuy/items/c73c41f85832bff1dbc1
標準のMatrixライブラリがこんな状態なので、外部のライブラリでNMatrixなるものがあり、こちらは計算方法やデータの扱いが工夫されていて、パフォーマンスも高いけど、依存パッケージがあったり環境変数を設定しないといけなかったりと、扱いづらいのが欠点でした。
標準のMatrixクラスが劇的に改善!!
Pythonにも負けない(?)行列計算ができるようになりそうです。
Ruby2.2.0-preview1のインストール
ruby-buildに登録されているので、rbenvでインストールできます。
#terminal
CONFIGURE_OPTS="--enable-bundled-libyaml" rbenv install 2.2.0-preview1
Ruby2.2のMatrixクラスでできること
■基本演算
#irbを立ち上げて
require 'matrix'
#3×5のランダム行列の生成
Matrix.build(2,2) { rand }
=> Matrix[[0.8571359857200008, 0.028076907386971994], [0.5420561909522512, 0.7052229658795479]]
#行列の値とか行、列の取得とか
Matrix[ [1,2], [3,4] ].each_with_index do |i, row, col|
puts "#{i} at #{row}, #{col}"
end
#出力結果↓
1 at 0, 0
2 at 0, 1
3 at 1, 0
4 at 1, 1
=>
Matrix[[1, 2], [3, 4]]
#逆行列
Matrix[[-1, -1], [0, -1]].inverse
#転置
Matrix[[1,2], [3,4], [5,6]].transpose
その他、複素数とか諸々の計算は色々できます。
http://ruby-doc.org/stdlib-2.1.3/libdoc/matrix/rdoc/Matrix.html
■n次元連立方程式を解ける!?
m=Matrix[[1,1,1,0],[1,1,0,1],[1,0,1,1],[0,1,1,1]]
m.lup.solve([3,3,3,3])
=> Vector[(1/1), (1/1), (1/1), (1/1)] #a=1, b=1, c=1, d=1って意味です。
す、すげぇ〜!
__■特殊な行列計算
LU分解、ラプラス展開、余因子展開、余因子行列、スペクトル分解、複素数行列などはこちらを参考に。
http://bit.ly/1vKOZmD
ネットワーク解析とかレコメンド系とか統計解析系が、かなり便利になりますね。
というわけで、まだまだ需要が高まりそうな行列計算をRubyでいい感じに使えるようになったのは、
Rubyistにとっては朗報ですね。
もうちょっと色々いじってみたいと思います!