読者です 読者をやめる 読者になる 読者になる

rioRESERVoir

Allajah/Rioの個人ブログ

行列計算はMatrix

先ほどの記事を投稿した後


ありたそ師範からMatrixクラス使ってみよ.との言葉を頂いたのでやってみた

結論はこんなかんじに

require 'csv'
require 'matrix'

matrix_a=Matrix.rows(CSV.read("./matrixA.csv")).map{|x| x.to_i}
matrix_b=Matrix.rows(CSV.read("./matrixB.csv")).map{|x| x.to_i}

p matrix_a+matrix_b

めちゃ短くすんだ・・・

rowsメソッド

Matrixクラスのrowsメソッドは引数(このばあいはCSVクラスのreadメソッドで開いたCSVファイル)を行ベクトルの列とする行列を生成する.(http://docs.ruby-lang.org/ja/1.8.7/method/Matrix/s/rows.html)
ちょっと何言ってるかわからない.
matrix_aについてわかりやすく書き換えると

matrix_a=Matrix.rows([[1,2,3],[4,5,6],[7,8,9]])
#出力結果:Matrix[[1, 2, 3], [4, 5, 6], [7, 8, 9]]

これと同じ.行ベクトルの列とする行列を生成するというのは
f:id:Allajah:20140805205511j:plain
こういうこと.
逆に,列ベクトルの行とする行列を生成するのはcolumnsメソッドを使う.

matrix_a=Matrix.columns([[1,2,3],[4,5,6],[7,8,9]])
# 出力結果:Matrix[[1, 4, 7], [2, 5, 8], [3, 6, 9]]

f:id:Allajah:20140805210143j:plain
転置行列になった.

collect(map)メソッド

Matrixクラスのインスタンメソッド
"行列の各要素に対してブロックの適用を繰り返した結果を,要素として持つ行列を生成する"
らしい(http://docs.ruby-lang.org/ja/1.8.7/method/Matrix/i/collect.html)
行列のすべての成分に対してなにか処理加えるってことかな(多分)

matrix_a=Matrix.rows(CSV.read("./matrixA.csv")).map{|x| x.to_i+100}

とすればすべての成分に100加えられた行列が生成される.


一つ賢くなった.間違いあるかも知れないからちゃんと確認しなおそう・・・