豊福@パパイヤです。

けいじゅさん
>>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