LoginSignup
10
10

More than 5 years have passed since last update.

Ruby2.2.0-preview1速報(Matrix版)

Last updated at Posted at 2014-10-22

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にとっては朗報ですね。

もうちょっと色々いじってみたいと思います!

10
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
10