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

ruby-changes:20419

From: marcandre <ko1@a...>
Date: Sat, 9 Jul 2011 11:41:23 +0900 (JST)
Subject: [ruby-changes:20419] marcandRe: r32467 (trunk): * lib/matrix.rb: Add Vector#normalize

marcandre	2011-07-09 11:41:14 +0900 (Sat, 09 Jul 2011)

  New Revision: 32467

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=32467

  Log:
    * lib/matrix.rb: Add Vector#normalize [ruby-dev:43829]

  Modified files:
    trunk/ChangeLog
    trunk/NEWS
    trunk/lib/matrix.rb

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 32466)
+++ ChangeLog	(revision 32467)
@@ -1,3 +1,7 @@
+Sat Jul  9 11:41:03 2011  Marc-Andre Lafortune  <ruby-core@m...>
+
+	* lib/matrix.rb: Add Vector#normalize [ruby-dev:43829]
+
 Sat Jul  9 09:25:06 2011  Eric Hodel  <drbrain@s...>
 
 	* enumerator.c:  Remove "enumeration sequenced by".
Index: lib/matrix.rb
===================================================================
--- lib/matrix.rb	(revision 32466)
+++ lib/matrix.rb	(revision 32467)
@@ -1517,8 +1517,11 @@
 # Vector functions:
 # * <tt> #inner_product(v)                    </tt>
 # * <tt> #collect                             </tt>
+# * <tt> #magnitude                           </tt>
 # * <tt> #map                                 </tt>
 # * <tt> #map2(v)                             </tt>
+# * <tt> #norm                                </tt>
+# * <tt> #normalize                           </tt>
 # * <tt> #r                                   </tt>
 # * <tt> #size                                </tt>
 #
@@ -1778,7 +1781,31 @@
     Math.sqrt(@elements.inject(0) {|v, e| v + e*e})
   end
   alias r magnitude
+  alias norm magnitude
 
+  #
+  # Like Vector#collect2, but returns a Vector instead of an Array.
+  #
+  def map2(v, &block) # :yield: e1, e2
+    return to_enum(:map2, v) unless block_given?
+    els = collect2(v, &block)
+    Vector.elements(els, false)
+  end
+
+  class ZeroVectorError < StandardError
+  end
+  #
+  # Returns a new vector with the same direction but with norm 1.
+  #   v = Vector[5,8,2].normalize
+  #   # => Vector[0.5184758473652127, 0.8295613557843402, 0.20739033894608505]
+  #   v.norm => 1.0
+  #
+  def normalize
+    n = magnitude
+    raise ZeroVectorError, "Zero vectors can not be normalized" if n == 0
+    self / n
+  end
+
   #--
   # CONVERTING
   #++
Index: NEWS
===================================================================
--- NEWS	(revision 32466)
+++ NEWS	(revision 32467)
@@ -182,7 +182,8 @@
     * Matrix#unitary?
     * Matrix#upper_triangular?
     * Matrix#zero?
-    * Vector#magnitude
+    * Vector#magnitude, #norm
+    * Vector#normalize
   * extended methods:
     * Matrix#each and #each_with_index can iterate on a subset of the elements
     * Matrix#find_index returns [row, column] and can iterate on a subset

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

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