diff options
Diffstat (limited to 'lib/matrix.rb')
-rw-r--r-- | lib/matrix.rb | 67 |
1 files changed, 37 insertions, 30 deletions
diff --git a/lib/matrix.rb b/lib/matrix.rb index 64b0738e1b..4767b4b545 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.6 $ -# $Date: 1998/07/31 03:39:49 $ +# $Revision: 1.8 $ +# $Date: 1999/02/17 12:34:19 $ # Original Version from Smalltalk-80 version # on July 23, 1985 at 8:37:17 am # by Keiju ISHITSUKA @@ -17,6 +18,8 @@ # : # rown] # +# column: �� +# row: �� # # module ExceptionForMatrix:: # Exceptions: @@ -173,19 +176,19 @@ require "e2mmap.rb" module ExceptionForMatrix - Exception2MessageMapper.extend_to(binding) - + extend Exception2MessageMapper def_e2message(TypeError, "wrong argument type %s (expected %s)") def_e2message(ArgumentError, "Wrong # of arguments(%d for %d)") - def_exception("ErrDimensionMismatch", "\#{self.type} dimemsion mismatch") + def_exception("ErrDimensionMismatch", "\#{self.name} dimension mismatch") def_exception("ErrNotRegular", "Not Regular Matrix") def_exception("ErrOperationNotDefined", "This operation(%s) can\\'t defined") end class Matrix - @RCS_ID='-$Id: matrix.rb,v 1.6 1998/07/31 03:39:49 keiju Exp keiju $-' - + @RCS_ID='-$Id: matrix.rb,v 1.8 1999/02/17 12:34:19 keiju Exp keiju $-' + +# extend Exception2MessageMapper include ExceptionForMatrix # instance creations @@ -337,7 +340,7 @@ class Matrix from_col = param[2] size_col = param[3] else - Matrix.fail ArgumentError, param.inspect + Matrix.Raise ArgumentError, param.inspect end rows = @rows[from_row, size_row].collect{ @@ -410,7 +413,7 @@ class Matrix r = self * m return r.column(0) when Matrix - Matrix.fail ErrDimensionMismatch if column_size != m.row_size + Matrix.Raise ErrDimensionMismatch if column_size != m.row_size rows = (0 .. row_size - 1).collect { |i| @@ -434,7 +437,7 @@ class Matrix def +(m) case m when Numeric - Matrix.fail ErrOperationNotDefined, "+" + Matrix.Raise ErrOperationNotDefined, "+" when Vector m = Matrix.column_vector(m) when Matrix @@ -443,7 +446,7 @@ class Matrix return x + y end - Matrix.fail ErrDimensionMismatch unless row_size == m.row_size and column_size == m.column_size + Matrix.Raise ErrDimensionMismatch unless row_size == m.row_size and column_size == m.column_size rows = (0 .. row_size - 1).collect { |i| @@ -458,7 +461,7 @@ class Matrix def -(m) case m when Numeric - Matrix.fail ErrOperationNotDefined, "-" + Matrix.Raise ErrOperationNotDefined, "-" when Vector m = Matrix.column_vector(m) when Matrix @@ -467,7 +470,7 @@ class Matrix return x - y end - Matrix.fail ErrDimensionMismatch unless row_size == m.row_size and column_size == m.column_size + Matrix.Raise ErrDimensionMismatch unless row_size == m.row_size and column_size == m.column_size rows = (0 .. row_size - 1).collect { |i| @@ -499,7 +502,7 @@ class Matrix end def inverse - Matrix.fail ErrDimensionMismatch unless square? + Matrix.Raise ErrDimensionMismatch unless square? Matrix.I(row_size).inverse_from(self) end alias inv inverse @@ -512,7 +515,7 @@ class Matrix if (akk = a[k][k]) == 0 i = k begin - fail ErrNotRegular if (i += 1) > size + Matrix.Raise ErrNotRegular if (i += 1) > size end while a[i][k] == 0 a[i], a[k] = a[k], a[i] @rows[i], @rows[k] = @rows[k], @rows[i] @@ -568,9 +571,9 @@ class Matrix end z elsif other.kind_of?(Float) || defined?(Rational) && other.kind_of?(Rational) - fail ErrOperationNotDefined, "**" + Matrix.Raise ErrOperationNotDefined, "**" else - fail ErrOperationNotDefined, "**" + Matrix.Raise ErrOperationNotDefined, "**" end end @@ -663,6 +666,8 @@ class Matrix case other when Numeric return Scalar.new(other), self + else + raise TypeError, "#{type} can't be coerced into #{other.type}" end end @@ -725,7 +730,7 @@ class Matrix when Numeric Scalar.new(@value + other) when Vector, Matrix - Scalar.fail WrongArgType, other.type, "Numeric or Scalar" + Scalar.Raise WrongArgType, other.type, "Numeric or Scalar" when Scalar Scalar.new(@value + other.value) else @@ -739,7 +744,7 @@ class Matrix when Numeric Scalar.new(@value - other) when Vector, Matrix - Scalar.fail WrongArgType, other.type, "Numeric or Scalar" + Scalar.Raise WrongArgType, other.type, "Numeric or Scalar" when Scalar Scalar.new(@value - other.value) else @@ -765,7 +770,7 @@ class Matrix when Numeric Scalar.new(@value / other) when Vector - Scalar.fail WrongArgType, other.type, "Numeric or Scalar or Matrix" + Scalar.Raise WrongArgType, other.type, "Numeric or Scalar or Matrix" when Matrix self * _M.inverse else @@ -779,7 +784,7 @@ class Matrix when Numeric Scalar.new(@value ** other) when Vector - Scalar.fail WrongArgType, other.type, "Numeric or Scalar or Matrix" + Scalar.Raise WrongArgType, other.type, "Numeric or Scalar or Matrix" when Matrix other.powered_by(self) else @@ -802,7 +807,7 @@ class Vector private_class_method :new def Vector.[](*array) - new(:init_elements, array, FALSE) + new(:init_elements, array, copy = FALSE) end def Vector.elements(array, copy = TRUE) @@ -833,7 +838,7 @@ class Vector # ENUMRATIONS def each2(v) - Vector.fail ErrDimensionMismatch if size != v.size + Vector.Raise ErrDimensionMismatch if size != v.size 0.upto(size - 1) do |i| yield @elements[i], v[i] @@ -841,7 +846,7 @@ class Vector end def collect2(v) - Vector.fail ErrDimensionMismatch if size != v.size + Vector.Raise ErrDimensionMismatch if size != v.size (0 .. size - 1).collect do |i| yield @elements[i], v[i] @@ -878,7 +883,7 @@ class Vector when Matrix self.covector * x else - s, x = X.corece(self) + s, x = X.coerce(self) s * x end end @@ -886,7 +891,7 @@ class Vector def +(v) case v when Vector - Vector.fail ErrDimensionMismatch if size != v.size + Vector.Raise ErrDimensionMismatch if size != v.size els = collect2(v) { |v1, v2| v1 + v2 @@ -895,7 +900,7 @@ class Vector when Matrix Matrix.column_vector(self) + v else - s, x = v.corece(self) + s, x = v.coerce(self) s + x end end @@ -903,7 +908,7 @@ class Vector def -(v) case v when Vector - Vector.fail ErrDimensionMismatch if size != v.size + Vector.Raise ErrDimensionMismatch if size != v.size els = collect2(v) { |v1, v2| v1 - v2 @@ -912,7 +917,7 @@ class Vector when Matrix Matrix.column_vector(self) - v else - s, x = v.corece(self) + s, x = v.coerce(self) s - x end end @@ -920,7 +925,7 @@ class Vector # VECTOR FUNCTIONS def inner_product(v) - Vector.fail ErrDimensionMismatch if size != v.size + Vector.Raise ErrDimensionMismatch if size != v.size p = 0 each2(v) { @@ -980,6 +985,8 @@ class Vector case other when Numeric return Scalar.new(other), self + else + raise TypeError, "#{type} can't be coerced into #{other.type}" end end |