From d09cde1861e2aecec2bed10895adab489e3d5f99 Mon Sep 17 00:00:00 2001 From: marcandre Date: Wed, 16 Sep 2009 21:02:54 +0000 Subject: * lib/matrix.rb: Optimizations git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@24968 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- lib/matrix.rb | 71 +++++++++++++++++++++-------------------------------------- 1 file changed, 25 insertions(+), 46 deletions(-) (limited to 'lib/matrix.rb') diff --git a/lib/matrix.rb b/lib/matrix.rb index bb2d9af36d..1ed4e16c4d 100644 --- a/lib/matrix.rb +++ b/lib/matrix.rb @@ -322,8 +322,8 @@ class Matrix # => 1 4 # 9 16 # - def collect # :yield: e - rows = @rows.collect{|row| row.collect{|e| yield e}} + def collect(&block) # :yield: e + rows = @rows.collect{|row| row.collect(&block)} Matrix.rows(rows, false) end alias map collect @@ -457,11 +457,9 @@ class Matrix rows = (0 ... row_size).collect {|i| (0 ... m.column_size).collect {|j| - vij = 0 - column_size.times do |k| - vij += self[i, k] * m[k, j] + (0 ... column_size).inject(0) do |vij, k| + vij + self[i, k] * m[k, j] end - vij } } return Matrix.rows(rows, false) @@ -667,11 +665,10 @@ class Matrix det = 1 size.times do |k| if (akk = a[k][k]) == 0 - i = k - loop do - return 0 if (i += 1) >= size - break unless a[i][k] == 0 - end + i = (k+1 ... size).find {|i| + a[i][k] != 0 + } + return 0 if i.nil? a[i], a[k] = a[k], a[i] akk = a[k][k] det *= -1 @@ -708,11 +705,10 @@ class Matrix det = 1 size.times do |k| if a[k][k].zero? - i = k - loop do - return 0 if (i += 1) >= size - break unless a[i][k].zero? - end + i = (k+1 ... size).find {|i| + a[i][k] != 0 + } + return 0 if i.nil? a[i], a[k] = a[k], a[i] det *= -1 end @@ -755,36 +751,21 @@ class Matrix rank = 0 a_column_size.times do |k| if (akk = a[k][k]) == 0 - i = k - exists = true - loop do - if (i += 1) >= a_column_size - exists = false - break - end - break unless a[i][k] == 0 - end - if exists + i = (k+1 ... a_column_size).find {|i| + a[i][k] != 0 + } + if i a[i], a[k] = a[k], a[i] akk = a[k][k] else - i = k - exists = true - loop do - if (i += 1) >= a_row_size - exists = false - break - end - break unless a[k][i] == 0 - end - if exists - (k ... a_column_size).each do |j| - a[j][k], a[j][i] = a[j][i], a[j][k] - end - akk = a[k][k] - else - next + i = (k+1 ... a_row_size).find {|i| + a[k][i] != 0 + } + next if i.nil? + (k ... a_column_size).each do |j| + a[j][k], a[j][i] = a[j][i], a[j][k] end + akk = a[k][k] end end @@ -840,11 +821,9 @@ class Matrix # => 16 # def trace - tr = 0 - column_size.times do |i| - tr += @rows[i][i] + (0...column_size).inject(0) do |tr, i| + tr + @rows[i][i] end - tr end alias tr trace -- cgit v1.2.3