Edited at

Ruby2.2 ではアレが死ぬほど使いやすくなるの!

More than 3 years have passed since last update.

そうです、Matrix(行列)クラスに色々入る予定のようです.

....

いやもっと伝えるべきモノが他にあるとの怒号が今にも聞こえて来そうですが...

「すみません今日の所は行列の紹介をさせて下さい.」

多くの方は興味もないであろうけど、

Rubyには行列やベクトルを扱う Matrix クラスというものがありまして、

Ruby2.2では色々新機能やバグfixが入るようです.


「行列ベクトル演算するならRubyよね」

と言われるくらいのモノにはなるのではないでしょうか?

本日はRuby2.2以前にあるものも含めMatrixのマジですごい所を紹介します.


使わないともったいない!すごいMatrix, 楽しく学ぼう!


1. LU分解

LU分解が出来るという事は...


n元連立方程式をいとも簡単に解く事が出来ちゃうの

# 2x + y = 2

# x + 2y = 3

Matrix[
[2, 1],
[1, 2]
].lup.solve([2, 3])

# => Vector[(1/3), (4/3)]

ステキやん?

(2.1にもあります.)


2. ラプラス展開

これは推したい、色々な数値計算ソフトを使ってきましたが、

ラプラス展開を標準でのせているものは多くはないのでは?

(その割に使用頻度高い)

しかも

展開に用いる行、列の要素は数字に限らなくて、

* が定義されているオブジェクトが納められている行か列に対して展開出来ます.

無駄にスゲー.


だからこんな事が出来ちゃうの

v1 = Vector[1, 0]

v2 = Vector[0, 1]

Matrix[
[v1, v2],
[2, 3]
].laplace_expansion(row: 0)

#=> Vector[3, -2]

row: nn行沿いの、column: nn列沿いの展開というインターフェイスの良さ.

ステキやん?

(2.2で入ると思われます.)


3. 余因子展開

非常によく使われる演算の一つ、余因子展開がついに実装されました.

Matrix.diagonal(9, 5, -3, 4).cofactor(1, 1)

# => -108

統計解析で分散共分散行列を扱う時など便利ですネ!

(2.2で入ると思われます.)


4. 余因子行列

こちらはパッチを見ていただいてる最中で、まだ分かりませんが入れたいと思っています.

Matrix[ 

[7, 6],
[3, 9]
].adjugate

# => 9 -6
# -3 7

行列式に対する微分演算に関する事や逆行列との関係など重要なかなり重要な性質をもつ演算の一つです.

(僕がちゃんとやれば2.2で入ると思われます.)


5. スペクトル分解

アノ、対角行列と固有値行列に分けるアレです.

きわめて大事ですよね、

A = Matrix[

[-1, 2],
[-6, 6]
].eigensystem

P, D, P_inv = A.eigensystem

(P * D * P_inv).round(5) == A

#=> true

ステキ

(Ruby2.1 にも入ってる)


6. 行列式や逆行列などその他基本演算も当たり前

とりわけ触れる必要は無さそうですが、基本的な線形演算は大体あります.


# 行列式
Matrix[
[7, 6],
[3, 9]
].det
# => 45

# 階数
Matrix[
[7, 6],
[3, 9]
].rank

# => 2

# 逆行列
A = Matrix[
[7, 6],
[3, 9]
]

A * A.inv == Matrix.I(2)
# => true

v1 = Vector[1,2,3]
v2 = Vector[4,5,6]

# 内積
v1.inner_product(v2)
# => 32

# 外積
v1.cross_product(v2)
# => Vector[-3, 6, -3]

...


7. 複素行列も当たり前

今までお話した事はすべて、複素行列に対しても言えます!!

(Rubyの複素数は地味にすごい)


エルミート転置とかユニタリ行列とかも楽勝に扱えちゃうの

A = Matrix[

[2i, 3],
[2, 5i]
]
A.conjugate
# => -2i 3
# 2 -5i

A = Matrix[
[0, (0+1i)],
[(0+1i), 0]
]

A.unitary?
# => true


  • Ruby2.1から複素数を2iの様な形式で扱える(!!

さてこんな素晴らしい Ruby 2.2 は今年の12月のクリスマス?にリリース予定らしいです.

自前でビルドすれば実際にいじくる事も出来るので、是非いじくり倒してみるとよいです!

(プレビュー期間?とやらなので)

行列に限らずもっと素晴らしいモノが沢山入っているのでその辺りも気が向いたら紹介します!

後、行列やMath周りで欲しい機能があったら言って頂ければ僕が代わりにパッチ投げますヨ

(コミッターでも何者でもない僕ですが....この辺りはもっと盛り上げたいです.)

おやすみ.