simanのブログ

ゆるふわプログラマー。競技プログラミングやってます。Ruby好き

rubyで2次元配列を使用しての行列表現&行列の回転

rubyで行列を扱いたい場合には標準クラスでMatrixクラスが用意されていますが、そこまで複雑な操作をしないのであれば、二次元配列で簡単に行列を表現することが可能です。

require 'pp'

mat = [[1,2,3],[4,5,6],[7,8,9]]

pp mat
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]

これで下図のような行列が出来ました。

f:id:simanman:20130327004519j:plain


・回転も欲しくなるよね

行列の回転を行うにはtransposeメソッドとreverseメソッドを使用します。

require 'pp'

mat = [[1,2,3],[4,5,6],[7,8,9]]

pp mat.transpose.map(&:reverse)  #=> 右回転
pp mat.reverse.map(&:reverse)    #=> 180度回転
pp mat.transpose.reverse         #=> 左回転
[[7, 4, 1], [8, 5, 2], [9, 6, 3]]
[[9, 8, 7], [6, 5, 4], [3, 2, 1]]
[[3, 6, 9], [2, 5, 8], [1, 4, 7]]

これで行列の回転ができるようになりました。下の図でそれぞれの操作と行列の変化を表示します。

f:id:simanman:20130327013812j:plain

たまに必要になるときがあるので、覚えて損はないはず?