Extended maintenance of Ruby 1.9.3 ended on February 23, 2015. Read more
The Vector
class represents a mathematical vector, which is
useful in its own right, and also constitutes a row or column of a Matrix.
To create a Vector:
Vector.[](*array)
Vector.elements(array, copy = true)
To access elements:
[](i)
To enumerate the elements:
#each2(v)
#collect2(v)
Vector arithmetic:
*(x) "is matrix or number"
+(v)
-(v)
Vector functions:
#inner_product(v)
#collect
#magnitude
#map
#map2(v)
#norm
#normalize
#r
#size
Conversion to other data types:
#covector
#to_a
#coerce(other)
String representations:
#to_s
#inspect
Creates a Vector from a list of elements.
Vector[7, 4, ...]
# File matrix.rb, line 1551 def Vector.[](*array) new convert_to_array(array, false) end
Creates a vector from an Array. The optional second argument specifies whether the array itself or a copy is used internally.
# File matrix.rb, line 1559 def Vector.elements(array, copy = true) new convert_to_array(array, copy) end
::new is private; use Vector[] or ::elements to create.
# File matrix.rb, line 1566 def initialize(array) # No checking is done at this point. @elements = array end
Multiplies the vector by x
, where x
is a number
or another vector.
# File matrix.rb, line 1673 def *(x) case x when Numeric els = @elements.collect{|e| e * x} Vector.elements(els, false) when Matrix Matrix.column_vector(self) * x when Vector Vector.Raise ErrOperationNotDefined, "*", self.class, x.class else apply_through_coercion(x, __method__) end end
Vector addition.
# File matrix.rb, line 1690 def +(v) case v when Vector Vector.Raise ErrDimensionMismatch if size != v.size els = collect2(v) {|v1, v2| v1 + v2 } Vector.elements(els, false) when Matrix Matrix.column_vector(self) + v else apply_through_coercion(v, __method__) end end
Vector subtraction.
# File matrix.rb, line 1708 def -(v) case v when Vector Vector.Raise ErrDimensionMismatch if size != v.size els = collect2(v) {|v1, v2| v1 - v2 } Vector.elements(els, false) when Matrix Matrix.column_vector(self) - v else apply_through_coercion(v, __method__) end end
Vector division.
# File matrix.rb, line 1726 def /(x) case x when Numeric els = @elements.collect{|e| e / x} Vector.elements(els, false) when Matrix, Vector Vector.Raise ErrOperationNotDefined, "/", self.class, x.class else apply_through_coercion(x, __method__) end end
Returns true
iff the two vectors have the same elements in the
same order.
# File matrix.rb, line 1642 def ==(other) return false unless Vector === other @elements == other.elements end
Returns element number i
(starting at zero) of the vector.
# File matrix.rb, line 1576 def [](i) @elements[i] end
Return a copy of the vector.
# File matrix.rb, line 1655 def clone Vector.elements(@elements) end
The coerce method provides support for Ruby type coercion. This coercion mechanism is used by Ruby to handle mixed-type numeric operations: it is intended to find a compatible common type between the two operands of the operator. See also Numeric#coerce.
# File matrix.rb, line 1839 def coerce(other) case other when Numeric return Matrix::Scalar.new(other), self else raise TypeError, "#{self.class} can't be coerced into #{other.class}" end end
Like Array#collect.
# File matrix.rb, line 1759 def collect(&block) # :yield: e return to_enum(:collect) unless block_given? els = @elements.collect(&block) Vector.elements(els, false) end
Collects (as in Enumerable#collect) over the elements of this vector and
v
in conjunction.
# File matrix.rb, line 1626 def collect2(v) # :yield: e1, e2 raise TypeError, "Integer is not like Vector" if v.kind_of?(Integer) Vector.Raise ErrDimensionMismatch if size != v.size return to_enum(:collect2, v) unless block_given? Array.new(size) do |i| yield @elements[i], v[i] end end
Creates a single-row matrix from this vector.
# File matrix.rb, line 1806 def covector Matrix.row_vector(self) end
Iterate over the elements of this vector
# File matrix.rb, line 1603 def each(&block) return to_enum(:each) unless block_given? @elements.each(&block) self end
Iterate over the elements of this vector and v
in conjunction.
# File matrix.rb, line 1612 def each2(v) # :yield: e1, e2 raise TypeError, "Integer is not like Vector" if v.kind_of?(Integer) Vector.Raise ErrDimensionMismatch if size != v.size return to_enum(:each2, v) unless block_given? size.times do |i| yield @elements[i], v[i] end self end
# File matrix.rb, line 1817 def elements_to_f warn "#{caller(1)[0]}: warning: Vector#elements_to_f is deprecated" map(&:to_f) end
# File matrix.rb, line 1822 def elements_to_i warn "#{caller(1)[0]}: warning: Vector#elements_to_i is deprecated" map(&:to_i) end
# File matrix.rb, line 1827 def elements_to_r warn "#{caller(1)[0]}: warning: Vector#elements_to_r is deprecated" map(&:to_r) end
# File matrix.rb, line 1647 def eql?(other) return false unless Vector === other @elements.eql? other.elements end
Return a hash-code for the vector.
# File matrix.rb, line 1662 def hash @elements.hash end
Returns the inner product of this vector with the other.
Vector[4,7].inner_product Vector[10,1] => 47
# File matrix.rb, line 1746 def inner_product(v) Vector.Raise ErrDimensionMismatch if size != v.size p = 0 each2(v) {|v1, v2| p += v1 * v2 } p end
Overrides Object#inspect
# File matrix.rb, line 1862 def inspect "Vector" + @elements.inspect end
Returns the modulus (Pythagorean distance) of the vector.
Vector[5,8,2].r => 9.643650761
# File matrix.rb, line 1770 def magnitude Math.sqrt(@elements.inject(0) {|v, e| v + e*e}) 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
# File matrix.rb, line 1793 def normalize n = magnitude raise ZeroVectorError, "Zero vectors can not be normalized" if n == 0 self / n end
Returns the number of elements in the vector.
# File matrix.rb, line 1592 def size @elements.size end
Commenting is here to help enhance the documentation. For example, code samples, or clarification of the documentation.
If you have questions about Ruby or the documentation, please post to one of the Ruby mailing lists. You will get better, faster, help that way.
If you wish to post a correction of the docs, please do so, but also file bug report so that it can be corrected for the next release. Thank you.
If you want to help improve the Ruby documentation, please visit Documenting-ruby.org.