Rubyがすこしわかるようになった気がするらしい

レポート課題で行列計算が必要だったのでいつものようにRubyで書いた.
http://d.hatena.ne.jp/varutsu7/20090721/1248203955
ソース載せてる人が居るので俺の落書きコードも晒してみる.

require 'matrix'
require 'mathn'

mat_h = Matrix[
               [0, 1/2, 1/4, 0, 0, 0,   0],
               [0,   0, 1/4, 0, 0, 0, 1/2],
               [1,   0,   0, 0, 0, 0,   0],
               [0,   0,   0, 0, 0, 0,   0],
               [0,   0, 1/4, 0, 0, 0, 1/2],
               [0,   0, 1/4, 0, 1, 0,   0],
               [0, 1/2,   0, 0, 0, 0,   0]
              ]

mat_t = Matrix[*Array.new(7, [0, 0, 0, 1/7, 0, 1/7, 0])]
mat_u = Matrix[*Array.new(7, Array.new(7, 1/7))]

alpha = 1/10

mat_g =  (1 - alpha) * (mat_h + mat_t) + alpha * mat_u

pi = Matrix[Array.new(7, 1/7)].t

s = pi
3.times { s = mat_g * s }
puts "Google Matrix"
puts mat_g.to_a.map(&:inspect).join("\n")

puts "pi_3"
puts s.map(&:to_f)

puts "pi_k"
puts 100.times {|i|
  pre_pi = pi.map(&:to_f)
  pi = mat_g * pi
  t = pi.map(&:to_f)
  break "#{i + 1} #{t}" if pre_pi.to_a.flatten.zip(t.to_a.flatten).all? {|i, j|
    i.to_s == j.to_s
  }
}

MatrixがEnumeratorに対応してないのが残念.