diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 1999-10-12 04:53:36 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 1999-10-12 04:53:36 +0000 |
commit | be1fea072cd0d22788ef8a931c0c6b64a2503b5d (patch) | |
tree | 4d17e3f2cabbe9f4ea2bee8f523de11ce30f6a39 /lib/matrix.rb | |
parent | 758cb647c7ac9e02a9ee0d7cb0934a5c963481e0 (diff) |
19991012
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@537 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'lib/matrix.rb')
-rw-r--r-- | lib/matrix.rb | 100 |
1 files changed, 60 insertions, 40 deletions
diff --git a/lib/matrix.rb b/lib/matrix.rb index a408f4be91..f31da643ff 100644 --- a/lib/matrix.rb +++ b/lib/matrix.rb @@ -1,8 +1,9 @@ +#!/usr/local/bin/ruby # # matrix.rb - # $Release Version: 1.0$ -# $Revision: 1.9 $ -# $Date: 1999/08/24 10:25:00 $ +# $Revision: 1.11 $ +# $Date: 1999/10/06 11:01:53 $ # Original Version from Smalltalk-80 version # on July 23, 1985 at 8:37:17 am # by Keiju ISHITSUKA @@ -38,7 +39,7 @@ # creates a matrix where `rows' indicates rows. # `rows' is an array of arrays, # e.g, Matrix[[11, 12], [21, 22]] -# Matrix.rows(rows, copy = true) +# Matrix.rows(rows, copy = TRUE) # creates a matrix where `rows' indicates rows. # if optional argument `copy' is false, use the array as # internal structure of the metrix without copying. @@ -144,7 +145,7 @@ # # INSTANCE CREATION: # Vector.[](*array) -# Vector.elements(array, copy = true) +# Vector.elements(array, copy = TRUE) # ACCSESSING: # [](i) # size @@ -185,7 +186,7 @@ module ExceptionForMatrix end class Matrix - @RCS_ID='-$Id: matrix.rb,v 1.8 1999/02/17 12:34:19 keiju Exp keiju $-' + @RCS_ID='-$Id: matrix.rb,v 1.11 1999/10/06 11:01:53 keiju Exp keiju $-' # extend Exception2MessageMapper include ExceptionForMatrix @@ -194,10 +195,10 @@ class Matrix private_class_method :new def Matrix.[](*rows) - new(:init_rows, rows, false) + new(:init_rows, rows, FALSE) end - def Matrix.rows(rows, copy = true) + def Matrix.rows(rows, copy = TRUE) new(:init_rows, rows, copy) end @@ -209,7 +210,7 @@ class Matrix columns[j][i] } } - Matrix.rows(rows, false) + Matrix.rows(rows, FALSE) end def Matrix.diagonal(*values) @@ -220,7 +221,8 @@ class Matrix row[j] = values[j] row } - rows(rows, false) + self + rows(rows, FALSE) end def Matrix.scalar(n, value) @@ -242,11 +244,11 @@ class Matrix def Matrix.row_vector(row) case row when Vector - Matrix.rows([row.to_a], false) + Matrix.rows([row.to_a], FALSE) when Array - Matrix.rows([row.dup], false) + Matrix.rows([row.dup], FALSE) else - Matrix.row([[row]], false) + Matrix.row([[row]], FALSE) end end @@ -311,13 +313,13 @@ class Matrix |i| @rows[i][j] } - Vector.elements(col, false) + Vector.elements(col, FALSE) end end def collect rows = @rows.collect{|row| row.collect{|e| yield e}} - Matrix.rows(rows, false) + Matrix.rows(rows, FALSE) end alias map collect @@ -345,7 +347,7 @@ class Matrix |row| row[from_col, size_col] } - Matrix.rows(rows, false) + Matrix.rows(rows, FALSE) end # TESTING @@ -363,20 +365,20 @@ class Matrix # COMPARING def ==(other) - return false unless Matrix === other + return FALSE unless Matrix === other other.compare_by_row_vectors(@rows) end alias eql? == def compare_by_row_vectors(rows) - return false unless @rows.size == rows.size + return FALSE unless @rows.size == rows.size 0.upto(@rows.size - 1) do |i| - return false unless @rows[i] == rows[i] + return FALSE unless @rows[i] == rows[i] end - true + TRUE end def clone @@ -405,7 +407,7 @@ class Matrix e * m } } - return Matrix.rows(rows, false) + return Matrix.rows(rows, FALSE) when Vector m = Matrix.column_vector(m) r = self * m @@ -425,7 +427,7 @@ class Matrix vij } } - return Matrix.rows(rows, false) + return Matrix.rows(rows, FALSE) else x, y = m.coerce(self) return x * y @@ -453,7 +455,7 @@ class Matrix self[i, j] + m[i, j] } } - Matrix.rows(rows, false) + Matrix.rows(rows, FALSE) end def -(m) @@ -477,7 +479,7 @@ class Matrix self[i, j] - m[i, j] } } - Matrix.rows(rows, false) + Matrix.rows(rows, FALSE) end def /(other) @@ -490,7 +492,7 @@ class Matrix e / other } } - return Matrix.rows(rows, false) + return Matrix.rows(rows, FALSE) when Matrix return self * other.inverse else @@ -619,17 +621,36 @@ class Matrix k = 0 begin if (akk = a[k][k]) == 0 - i = -1 - nothing = false + i = k + exists = true begin if (i += 1) > column_size - 1 - nothing = true + exists = false break end end while a[i][k] == 0 - next if nothing - a[i], a[k] = a[k], a[i] - akk = a[k][k] + if exists + a[i], a[k] = a[k], a[i] + akk = a[k][k] + else + i = k + exists = true + begin + if (i += 1) > row_size - 1 + exists = false + break + end + end while a[k][i] == 0 + if exists + k.upto(column_size - 1) do + |j| + a[j][k], a[j][i] = a[j][i], a[j][k] + end + akk = a[k][k] + else + next + end + end end (k + 1).upto(row_size - 1) do |i| @@ -806,10 +827,10 @@ class Vector private_class_method :new def Vector.[](*array) - new(:init_elements, array, copy = false) + new(:init_elements, array, copy = FALSE) end - def Vector.elements(array, copy = true) + def Vector.elements(array, copy = TRUE) new(:init_elements, array, copy) end @@ -854,7 +875,7 @@ class Vector # COMPARING def ==(other) - return false unless Vector === other + return FALSE unless Vector === other other.compare_by(@elements) end @@ -874,11 +895,11 @@ class Vector # ARITHMETIC - def *(x) # is matrix or number + def *(x) "is matrix or number" case x when Numeric els = @elements.collect{|e| e * x} - Vector.elements(els, false) + Vector.elements(els, FALSE) when Matrix self.covector * x else @@ -895,7 +916,7 @@ class Vector |v1, v2| v1 + v2 } - Vector.elements(els, false) + Vector.elements(els, FALSE) when Matrix Matrix.column_vector(self) + v else @@ -912,7 +933,7 @@ class Vector |v1, v2| v1 - v2 } - Vector.elements(els, false) + Vector.elements(els, FALSE) when Matrix Matrix.column_vector(self) - v else @@ -939,7 +960,7 @@ class Vector |v| yield v } - Vector.elements(els, false) + Vector.elements(els, FALSE) end alias map collect @@ -948,7 +969,7 @@ class Vector |v1, v2| yield v1, v2 } - Vector.elements(els, false) + Vector.elements(els, FALSE) end def r @@ -999,4 +1020,3 @@ class Vector str = "Vector"+@elements.inspect end end - |