From fd08f3ac6b8fe61e6d4931d693d3c67fe7e00215 Mon Sep 17 00:00:00 2001 From: knu Date: Tue, 20 Mar 2007 02:29:09 +0000 Subject: [PATCH] * lib/matrix.rb (Matrix::inverse_from): adding partial pivoting to the Gauss-Jordan algorithm, making it stable. a patch from Peter Vanbroekhoven. [ruby-core:10641] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8@12105 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 6 ++++++ lib/matrix.rb | 18 ++++++++++++------ 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/ChangeLog b/ChangeLog index e6abf606ec..82a43b44d6 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +Tue Mar 20 11:28:41 2007 Akinori MUSHA + + * lib/matrix.rb (Matrix::inverse_from): adding partial pivoting to + the Gauss-Jordan algorithm, making it stable. a patch from + Peter Vanbroekhoven. [ruby-core:10641] + Mon Mar 19 11:39:29 2007 Minero Aoki * lib/net/protocol.rb (rbuf_read): extend buffer size for speed. diff --git a/lib/matrix.rb b/lib/matrix.rb index c62acdf9aa..470db19b05 100644 --- a/lib/matrix.rb +++ b/lib/matrix.rb @@ -590,15 +590,21 @@ class Matrix a = src.to_a for k in 0..size - if (akk = a[k][k]) == 0 - i = k - begin - Matrix.Raise ErrNotRegular if (i += 1) > size - end while a[i][k] == 0 + i = k + akk = a[k][k].abs + for j in (k+1)..size + v = a[j][k].abs + if v > akk + i = j + akk = v + end + end + Matrix.Raise ErrNotRegular if akk == 0 + if i != k a[i], a[k] = a[k], a[i] @rows[i], @rows[k] = @rows[k], @rows[i] - akk = a[k][k] end + akk = a[k][k] for i in 0 .. size next if i == k