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に対応してないのが残念.