From: toyofuku@... Date: 1998-04-03T20:27:26+09:00 Subject: [ruby-list:7323] Re: miner matrix 豊福@パパイヤです。 けいじゅさん >>matrix の matrix の掛け算を試したら >> require "matrix.rb" >> x = Matrix[[0, 1], [1, 0]] >> z = Matrix[[0, 0], [0, 0]] >> a = Matrix[[x, z], [z, x]] >> b = a * a >>の b[0, 0]を求める 0 + x * x + z * z の計算のところで >>0 + Matrix がエラーになりました。 >> def +(other); other; end となるゼロオブジェクトなら >>いいのかな。 > > 1. 上記, aは小行列を使って行列を構成していますが, きっと, 行列を要素とす > る行列を作っているのではなくて, 展開された行列のつもりである. > 2. それとも, 行列を要素としたまま計算したいんですかね? で, 展開する場合 > はそれなりのメソッドを呼んであげると... 単純に「可換でない要素」の行列として「行列」の行列を 選んだだけなので展開しない方の話です。 --- matrix.rb.orig Fri Feb 6 18:58:28 1998 +++ matrix.rb Tue Mar 17 13:13:19 1998 @@ -235,8 +235,8 @@ |i| (0 .. m.column_size - 1).collect { |j| - vij = 0 - 0.upto(column_size - 1) do + vij = self[i, 0] * m[0, j] + 1.upto(column_size - 1) do |k| vij += self[i, k] * m[k, j] end にするとか zero = Object.new # zero = Ring.new def zero.+(other); other; end; みたいなのを使って - vij = 0 + vij = zero にすると「可換でない要素」の行列でも掛け算が通るだろう という話です。 でも他のところでも 0 を使ってますからここだけ直しても 中途半端ですね。 --- 豊福@パパイヤ unbound@papaya.juice.or.jp toyofuku@juice.or.jp