ruby-changes:13211
From: marcandre <ko1@a...>
Date: Thu, 17 Sep 2009 06:03:12 +0900 (JST)
Subject: [ruby-changes:13211] Ruby:r24968 (trunk): * lib/matrix.rb: Optimizations
marcandre 2009-09-17 06:02:54 +0900 (Thu, 17 Sep 2009) New Revision: 24968 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=24968 Log: * lib/matrix.rb: Optimizations Modified files: trunk/ChangeLog trunk/lib/matrix.rb Index: ChangeLog =================================================================== --- ChangeLog (revision 24967) +++ ChangeLog (revision 24968) @@ -1,3 +1,7 @@ +Thu Sep 17 06:02:04 2009 Marc-Andre Lafortune <ruby-core@m...> + + * lib/matrix.rb: Optimizations + Thu Sep 17 00:36:01 2009 Tanaka Akira <akr@f...> * time.c (time_mdump): error message refined. Index: lib/matrix.rb =================================================================== --- lib/matrix.rb (revision 24967) +++ lib/matrix.rb (revision 24968) @@ -322,8 +322,8 @@ # => 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 @@ 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 @@ 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 @@ 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 @@ 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 + 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 - 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 - end + akk = a[k][k] end end @@ -840,11 +821,9 @@ # => 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 -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/