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.