From: Yukihiro Matsumoto Date: 2007-12-22T22:50:35+09:00 Subject: Re: Matrix can't be subclassed --Multipart_Sat_Dec_22_22:50:42_2007-1 Content-Type: text/plain; charset=US-ASCII Hi, In message "Re: Matrix can't be subclassed" on Sat, 22 Dec 2007 04:04:44 +0900, Trans writes: | |Matrix can't be subclassed b/c of definitions like this: | def Matrix.identity(n) | Matrix.scalar(n, 1) | end I made a small patch. Could you check it? If it's OK, I will check in to the trunk. matz. --Multipart_Sat_Dec_22_22:50:42_2007-1 Content-Type: application/octet-stream Content-Disposition: attachment; filename="p" Content-Transfer-Encoding: 7bit diff --git a/lib/matrix.rb b/lib/matrix.rb index bbb1144..6debfdd 100644 --- a/lib/matrix.rb +++ b/lib/matrix.rb @@ -149,7 +149,7 @@ class Matrix columns[j][i] } } - Matrix.rows(rows, false) + rows(rows, false) end # @@ -178,7 +178,7 @@ class Matrix # 0 5 # def Matrix.scalar(n, value) - Matrix.diagonal(*Array.new(n).fill(value, 0, n)) + diagonal(*Array.new(n).fill(value, 0, n)) end # @@ -188,7 +188,7 @@ class Matrix # 0 1 # def Matrix.identity(n) - Matrix.scalar(n, 1) + scalar(n, 1) end class << Matrix alias unit identity @@ -202,7 +202,7 @@ class Matrix # 0 0 # def Matrix.zero(n) - Matrix.scalar(n, 0) + scalar(n, 0) end # @@ -214,11 +214,11 @@ class Matrix def Matrix.row_vector(row) case row when Vector - Matrix.rows([row.to_a], false) + rows([row.to_a], false) when Array - Matrix.rows([row.dup], false) + rows([row.dup], false) else - Matrix.rows([[row]], false) + rows([[row]], false) end end @@ -233,11 +233,11 @@ class Matrix def Matrix.column_vector(column) case column when Vector - Matrix.columns([column.to_a]) + columns([column.to_a]) when Array - Matrix.columns([column]) + columns([column]) else - Matrix.columns([[column]]) + columns([[column]]) end end @@ -370,7 +370,7 @@ class Matrix |row| row[from_col, size_col] } - Matrix.rows(rows, false) + self.class.rows(rows, false) end #-- @@ -431,7 +431,7 @@ class Matrix # identical objects. # def clone - Matrix.rows(@rows) + self.class.rows(@rows) end # @@ -467,9 +467,9 @@ class Matrix e * m } } - return Matrix.rows(rows, false) + return self.class.rows(rows, false) when Vector - m = Matrix.column_vector(m) + m = self.class.column_vector(m) r = self * m return r.column(0) when Matrix @@ -487,7 +487,7 @@ class Matrix vij } } - return Matrix.rows(rows, false) + return self.class.rows(rows, false) else x, y = m.coerce(self) return x * y @@ -505,7 +505,7 @@ class Matrix when Numeric Matrix.Raise ErrOperationNotDefined, "+" when Vector - m = Matrix.column_vector(m) + m = self.class.column_vector(m) when Matrix else x, y = m.coerce(self) @@ -521,7 +521,7 @@ class Matrix self[i, j] + m[i, j] } } - Matrix.rows(rows, false) + self.class.rows(rows, false) end # @@ -535,7 +535,7 @@ class Matrix when Numeric Matrix.Raise ErrOperationNotDefined, "-" when Vector - m = Matrix.column_vector(m) + m = self.class.column_vector(m) when Matrix else x, y = m.coerce(self) @@ -551,7 +551,7 @@ class Matrix self[i, j] - m[i, j] } } - Matrix.rows(rows, false) + self.class.rows(rows, false) end # @@ -570,7 +570,7 @@ class Matrix e / other } } - return Matrix.rows(rows, false) + return self.class.rows(rows, false) when Matrix return self * other.inverse else @@ -587,7 +587,7 @@ class Matrix # def inverse Matrix.Raise ErrDimensionMismatch unless square? - Matrix.I(row_size).inverse_from(self) + self.class.I(row_size).inverse_from(self) end alias inv inverse @@ -655,7 +655,7 @@ class Matrix x = self if other <= 0 x = self.inverse - return Matrix.identity(self.column_size) if other == 0 + return self.class.identity(self.column_size) if other == 0 other = -other end z = x @@ -894,7 +894,7 @@ class Matrix # 2 4 6 # def transpose - Matrix.columns(@rows) + self.class.columns(@rows) end alias t transpose @@ -1237,7 +1237,7 @@ class Vector els = @elements.collect{|e| e * x} Vector.elements(els, false) when Matrix - Matrix.column_vector(self) * x + self.class.column_vector(self) * x else s, x = x.coerce(self) s * x @@ -1257,7 +1257,7 @@ class Vector } Vector.elements(els, false) when Matrix - Matrix.column_vector(self) + v + self.class.column_vector(self) + v else s, x = v.coerce(self) s + x @@ -1277,7 +1277,7 @@ class Vector } Vector.elements(els, false) when Matrix - Matrix.column_vector(self) - v + self.class.column_vector(self) - v else s, x = v.coerce(self) s - x @@ -1346,7 +1346,7 @@ class Vector # Creates a single-row matrix from this vector. # def covector - Matrix.row_vector(self) + self.class.row_vector(self) end # --Multipart_Sat_Dec_22_22:50:42_2007-1--