summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2010-01-09 20:35:28 +0000
committernobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2010-01-09 20:35:28 +0000
commit2ae2d9dd4dae4089bc1c0a813cd520734ad33d28 (patch)
tree0db059ee0330d04d475ab5d17f116a88d92171dd
parent6051cf527b70173a675a51084894be4dce56a0bd (diff)
* lib/matrix.rb (Matrix#inverse_from): use #quo. backported r9490.
* lib/matrix.rb (Matrix#determinant): ditto. [ruby-core:27507] * lib/matrix.rb (Matrix#rank): ditto. * lib/matrix.rb (Matrix::Scalar#initialize): ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8@26263 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog10
-rw-r--r--lib/matrix.rb16
-rw-r--r--test/matrix/test_matrix.rb107
3 files changed, 125 insertions, 8 deletions
diff --git a/ChangeLog b/ChangeLog
index a6fa509aae..65d0c8c86a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+Sun Jan 10 05:35:26 2010 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * lib/matrix.rb (Matrix#inverse_from): use #quo. backported r9490.
+
+ * lib/matrix.rb (Matrix#determinant): ditto. [ruby-core:27507]
+
+ * lib/matrix.rb (Matrix#rank): ditto.
+
+ * lib/matrix.rb (Matrix::Scalar#initialize): ditto.
+
Sun Jan 10 04:54:36 2010 Nobuyoshi Nakada <nobu@ruby-lang.org>
* class.c (rb_define_class): raise TypeError same as class
diff --git a/lib/matrix.rb b/lib/matrix.rb
index 93ae3a9909..35ccb62625 100644
--- a/lib/matrix.rb
+++ b/lib/matrix.rb
@@ -549,7 +549,7 @@ class Matrix
#
# Returns the inverse of the matrix.
- # Matrix[[1, 2], [2, 1]].inverse
+ # Matrix[[-1, -1], [0, -1]].inverse
# => -1 1
# 0 -1
#
@@ -585,7 +585,7 @@ class Matrix
size.times do |i|
next if i == k
- q = a[i][k] / akk
+ q = a[i][k].quo(akk)
a[i][k] = 0
(k + 1 ... size).each do |j|
@@ -597,10 +597,10 @@ class Matrix
end
(k + 1 ... size).each do |j|
- a[k][j] /= akk
+ a[k][j] = a[k][j].quo(akk)
end
size.times do |j|
- @rows[k][j] /= akk
+ @rows[k][j] = @rows[k][j].quo(akk)
end
end
self
@@ -649,7 +649,7 @@ class Matrix
# Returns the determinant of the matrix. If the matrix is not square, the
# result is 0.
# Matrix[[7,6], [3,9]].determinant
- # => 63
+ # => 45
#
def determinant
return 0 unless square?
@@ -670,7 +670,7 @@ class Matrix
end
(k + 1 ... size).each do |i|
- q = a[i][k] / akk
+ q = a[i][k].quo(akk)
(k + 1 ... size).each do |j|
a[i][j] -= a[k][j] * q
end
@@ -720,7 +720,7 @@ class Matrix
end
(k + 1 ... a_row_size).each do |i|
- q = a[i][k] / akk
+ q = a[i][k].quo(akk)
(k + 1... a_column_size).each do |j|
a[i][j] -= a[k][j] * q
end
@@ -879,7 +879,7 @@ class Matrix
self * other.inverse
else
x, y = other.coerce(self)
- x / y
+ x.quo(y)
end
end
diff --git a/test/matrix/test_matrix.rb b/test/matrix/test_matrix.rb
index 0850117b86..6b9b587c6d 100644
--- a/test/matrix/test_matrix.rb
+++ b/test/matrix/test_matrix.rb
@@ -46,4 +46,111 @@ class TestMatrix < Test::Unit::TestCase
assert_equal @m1.hash, @m2.hash
assert_equal @m1.hash, @m3.hash
end
+
+ def test_rank
+ [
+ [[0]],
+ [[0], [0]],
+ [[0, 0], [0, 0]],
+ [[0, 0], [0, 0], [0, 0]],
+ [[0, 0, 0]],
+ [[0, 0, 0], [0, 0, 0]],
+ [[0, 0, 0], [0, 0, 0], [0, 0, 0]],
+ [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]],
+ ].each do |rows|
+ assert_equal 0, Matrix[*rows].rank
+ end
+
+ [
+ [[1], [0]],
+ [[1, 0], [0, 0]],
+ [[1, 0], [1, 0]],
+ [[0, 0], [1, 0]],
+ [[1, 0], [0, 0], [0, 0]],
+ [[0, 0], [1, 0], [0, 0]],
+ [[0, 0], [0, 0], [1, 0]],
+ [[1, 0], [1, 0], [0, 0]],
+ [[0, 0], [1, 0], [1, 0]],
+ [[1, 0], [1, 0], [1, 0]],
+ [[1, 0, 0]],
+ [[1, 0, 0], [0, 0, 0]],
+ [[0, 0, 0], [1, 0, 0]],
+ [[1, 0, 0], [1, 0, 0]],
+ [[1, 0, 0], [1, 0, 0]],
+ [[1, 0, 0], [0, 0, 0], [0, 0, 0]],
+ [[0, 0, 0], [1, 0, 0], [0, 0, 0]],
+ [[0, 0, 0], [0, 0, 0], [1, 0, 0]],
+ [[1, 0, 0], [1, 0, 0], [0, 0, 0]],
+ [[0, 0, 0], [1, 0, 0], [1, 0, 0]],
+ [[1, 0, 0], [0, 0, 0], [1, 0, 0]],
+ [[1, 0, 0], [1, 0, 0], [1, 0, 0]],
+ [[1, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]],
+ [[1, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]],
+ [[1, 0, 0], [1, 0, 0], [0, 0, 0], [0, 0, 0]],
+ [[1, 0, 0], [0, 0, 0], [1, 0, 0], [0, 0, 0]],
+ [[1, 0, 0], [0, 0, 0], [0, 0, 0], [1, 0, 0]],
+ [[1, 0, 0], [1, 0, 0], [1, 0, 0], [0, 0, 0]],
+ [[1, 0, 0], [0, 0, 0], [1, 0, 0], [1, 0, 0]],
+ [[1, 0, 0], [1, 0, 0], [0, 0, 0], [1, 0, 0]],
+ [[1, 0, 0], [1, 0, 0], [1, 0, 0], [1, 0, 0]],
+
+ [[1]],
+ [[1], [1]],
+ [[1, 1]],
+ [[1, 1], [1, 1]],
+ [[1, 1], [1, 1], [1, 1]],
+ [[1, 1, 1]],
+ [[1, 1, 1], [1, 1, 1]],
+ [[1, 1, 1], [1, 1, 1], [1, 1, 1]],
+ [[1, 1, 1], [1, 1, 1], [1, 1, 1], [1, 1, 1]],
+ ].each do |rows|
+ matrix = Matrix[*rows]
+ assert_equal 1, matrix.rank
+ assert_equal 1, matrix.transpose.rank
+ end
+
+ [
+ [[1, 0], [0, 1]],
+ [[1, 0], [0, 1], [0, 0]],
+ [[1, 0], [0, 1], [0, 1]],
+ [[1, 0], [0, 1], [1, 1]],
+ [[1, 0, 0], [0, 1, 0]],
+ [[1, 0, 0], [0, 0, 1]],
+ [[1, 0, 0], [0, 1, 0], [0, 0, 0]],
+ [[1, 0, 0], [0, 0, 1], [0, 0, 0]],
+
+ [[1, 0, 0], [0, 0, 0], [0, 1, 0]],
+ [[1, 0, 0], [0, 0, 0], [0, 0, 1]],
+
+ [[1, 0], [1, 1]],
+ [[1, 2], [1, 1]],
+ [[1, 2], [0, 1], [1, 1]],
+ ].each do |rows|
+ m = Matrix[*rows]
+ assert_equal 2, m.rank
+ assert_equal 2, m.transpose.rank
+ end
+
+ [
+ [[1, 0, 0], [0, 1, 0], [0, 0, 1]],
+ [[1, 1, 0], [0, 1, 1], [1, 0, 1]],
+ [[1, 1, 0], [0, 1, 1], [1, 0, 1]],
+ [[1, 1, 0], [0, 1, 1], [1, 0, 1], [0, 0, 0]],
+ [[1, 1, 0], [0, 1, 1], [1, 0, 1], [1, 1, 1]],
+ [[1, 1, 1], [1, 1, 2], [1, 3, 1], [4, 1, 1]],
+ ].each do |rows|
+ m = Matrix[*rows]
+ assert_equal 3, m.rank
+ assert_equal 3, m.transpose.rank
+ end
+ end
+
+ def test_inverse
+ assert_equal(Matrix[[-1, 1], [0, -1]], Matrix[[-1, -1], [0, -1]].inverse)
+ end
+
+ def test_determinant
+ assert_equal(45, Matrix[[7,6], [3,9]].determinant)
+ assert_equal(-18, Matrix[[2,0,1],[0,-2,2],[1,2,3]].determinant)
+ end
end