[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]