summaryrefslogtreecommitdiff
path: root/lib/matrix.rb
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2007-03-19 05:39:07 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2007-03-19 05:39:07 +0000
commitde3770d158d8c955e450f1c2359cbc85b7515ebe (patch)
tree956c5071e8a980dd8478e9b5ee38db8c5083ab34 /lib/matrix.rb
parent33163ad123a14488cf163c274d1af56c8e5e7bcb (diff)
* 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/trunk@12096 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'lib/matrix.rb')
-rw-r--r--lib/matrix.rb18
1 files changed, 12 insertions, 6 deletions
diff --git a/lib/matrix.rb b/lib/matrix.rb
index 8142a52315..d49e16b8fa 100644
--- a/lib/matrix.rb
+++ b/lib/matrix.rb
@@ -599,15 +599,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