In Files

  • matrix.rb

Vector

The Vector class represents a mathematical vector, which is useful in its own right, and also constitutes a row or column of a Matrix.

Method Catalogue ↑

To create a Vector:

To access elements:

To enumerate the elements:

Properties of vectors:

Vector arithmetic:

  • #*(x) “is matrix or number”

  • #+(v)

  • #-(v)

  • #+@

  • #-@

Vector functions:

Conversion to other data types:

String representations:

Attributes

elements[R]

INSTANCE CREATION

Public Class Methods

[](*array) click to toggle source

Creates a Vector from a list of elements.

Vector[7, 4, ...]
 
               # File matrix.rb, line 1741
def Vector.[](*array)
  new convert_to_array(array, false)
end
            
basis(size:, index:) click to toggle source

Returns a standard basis n-vector, where k is the index.

Vector.basis(size:, index:) # => Vector[0, 1, 0]
 
               # File matrix.rb, line 1758
def Vector.basis(size,, index))
  raise ArgumentError, "invalid size (#{size} for 1..)" if size < 1
  raise ArgumentError, "invalid index (#{index} for 0...#{size})" unless 0 <= index && index < size
  array = Array.new(size, 0)
  array[index] = 1
  new convert_to_array(array, false)
end
            
elements(array, copy = true) click to toggle source

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 1749
def Vector.elements(array, copy = true)
  new convert_to_array(array, copy)
end
            
independent?(*vs) click to toggle source

Returns true iff all of vectors are linearly independent.

Vector.independent?(Vector[1,0], Vector[0,1])
  => true

Vector.independent?(Vector[1,2], Vector[2,4])
  => false
 
               # File matrix.rb, line 1851
def Vector.independent?(*vs)
  vs.each do |v|
    raise TypeError, "expected Vector, got #{v.class}" unless v.is_a?(Vector)
    Vector.Raise ErrDimensionMismatch unless v.size == vs.first.size
  end
  return false if vs.count > vs.first.size
  Matrix[*vs].rank.eql?(vs.count)
end
            
new(array) click to toggle source

::new is private; use Vector[] or ::elements to create.

 
               # File matrix.rb, line 1769
def initialize(array)
  # No checking is done at this point.
  @elements = array
end
            

Public Instance Methods

*(x) click to toggle source

Multiplies the vector by x, where x is a number or another vector.

 
               # File matrix.rb, line 1911
def *(x)
  case x
  when Numeric
    els = @elements.collect{|e| e * x}
    self.class.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
            
+(v) click to toggle source

Vector addition.

 
               # File matrix.rb, line 1928
def +(v)
  case v
  when Vector
    Vector.Raise ErrDimensionMismatch if size != v.size
    els = collect2(v) {|v1, v2|
      v1 + v2
    }
    self.class.elements(els, false)
  when Matrix
    Matrix.column_vector(self) + v
  else
    apply_through_coercion(v, __method__)
  end
end
            
+@() click to toggle source
 
               # File matrix.rb, line 1976
def +@
  self
end
            
-(v) click to toggle source

Vector subtraction.

 
               # File matrix.rb, line 1946
def -(v)
  case v
  when Vector
    Vector.Raise ErrDimensionMismatch if size != v.size
    els = collect2(v) {|v1, v2|
      v1 - v2
    }
    self.class.elements(els, false)
  when Matrix
    Matrix.column_vector(self) - v
  else
    apply_through_coercion(v, __method__)
  end
end
            
-@() click to toggle source
 
               # File matrix.rb, line 1980
def -@
  collect {|e| -e }
end
            
/(x) click to toggle source

Vector division.

 
               # File matrix.rb, line 1964
def /(x)
  case x
  when Numeric
    els = @elements.collect{|e| e / x}
    self.class.elements(els, false)
  when Matrix, Vector
    Vector.Raise ErrOperationNotDefined, "/", self.class, x.class
  else
    apply_through_coercion(x, __method__)
  end
end
            
==(other) click to toggle source

Returns true iff the two vectors have the same elements in the same order.

 
               # File matrix.rb, line 1880
def ==(other)
  return false unless Vector === other
  @elements == other.elements
end
            
[](i) click to toggle source

Returns element number i (starting at zero) of the vector.

 
               # File matrix.rb, line 1779
def [](i)
  @elements[i]
end
            
Also aliased as: element, component
angle_with(v) click to toggle source

Returns an angle with another vector. Result is within the [0…Math::PI].

Vector[1,0].angle_with(Vector[0,1])
# => Math::PI / 2
 
               # File matrix.rb, line 2085
def angle_with(v)
  raise TypeError, "Expected a Vector, got a #{v.class}" unless v.is_a?(Vector)
  Vector.Raise ErrDimensionMismatch if size != v.size
  prod = magnitude * v.magnitude
  raise ZeroVectorError, "Can't get angle of zero vector" if prod == 0

  Math.acos( inner_product(v) / prod )
end
            
clone() click to toggle source

Returns a copy of the vector.

 
               # File matrix.rb, line 1893
def clone
  self.class.elements(@elements)
end
            
coerce(other) click to toggle source

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 2134
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
            
collect() click to toggle source

Like Array#collect.

 
               # File matrix.rb, line 2040
def collect(&block) # :yield: e
  return to_enum(:collect) unless block_given?
  els = @elements.collect(&block)
  self.class.elements(els, false)
end
            
Also aliased as: map
collect2(v) click to toggle source

Collects (as in Enumerable#collect) over the elements of this vector and v in conjunction.

 
               # File matrix.rb, line 1829
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
            
component(i) click to toggle source
Alias for: []
covector() click to toggle source

Creates a single-row matrix from this vector.

 
               # File matrix.rb, line 2101
def covector
  Matrix.row_vector(self)
end
            
cross(*vs) click to toggle source
Alias for: cross_product
cross_product(*vs) click to toggle source

Returns the cross product of this vector with the others.

Vector[1, 0, 0].cross_product Vector[0, 1, 0]   => Vector[0, 0, 1]

It is generalized to other dimensions to return a vector perpendicular to the arguments.

Vector[1, 2].cross_product # => Vector[-2, 1]
Vector[1, 0, 0, 0].cross_product(
   Vector[0, 1, 0, 0],
   Vector[0, 0, 1, 0]
)  #=> Vector[0, 0, 0, 1]
 
               # File matrix.rb, line 2015
def cross_product(*vs)
  raise ErrOperationNotDefined, "cross product is not defined on vectors of dimension #{size}" unless size >= 2
  raise ArgumentError, "wrong number of arguments (#{vs.size} for #{size - 2})" unless vs.size == size - 2
  vs.each do |v|
    raise TypeError, "expected Vector, got #{v.class}" unless v.is_a? Vector
    Vector.Raise ErrDimensionMismatch unless v.size == size
  end
  case size
  when 2
    Vector[-@elements[1], @elements[0]]
  when 3
    v = vs[0]
    Vector[ v[2]*@elements[1] - v[1]*@elements[2],
      v[0]*@elements[2] - v[2]*@elements[0],
      v[1]*@elements[0] - v[0]*@elements[1] ]
  else
    rows = self, *vs, Array.new(size) {|i| Vector.basis(size: size, index: i) }
    Matrix.rows(rows).laplace_expansion(row: size - 1)
  end
end
            
Also aliased as: cross
dot(v) click to toggle source
Alias for: inner_product
each(&block) click to toggle source

Iterate over the elements of this vector

 
               # File matrix.rb, line 1806
def each(&block)
  return to_enum(:each) unless block_given?
  @elements.each(&block)
  self
end
            
each2(v) click to toggle source

Iterate over the elements of this vector and v in conjunction.

 
               # File matrix.rb, line 1815
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
            
element(i) click to toggle source
Alias for: []
elements_to_f() click to toggle source
 
               # File matrix.rb, line 2112
def elements_to_f
  warn "#{caller(1)[0]}: warning: Vector#elements_to_f is deprecated"
  map(&:to_f)
end
            
elements_to_i() click to toggle source
 
               # File matrix.rb, line 2117
def elements_to_i
  warn "#{caller(1)[0]}: warning: Vector#elements_to_i is deprecated"
  map(&:to_i)
end
            
elements_to_r() click to toggle source
 
               # File matrix.rb, line 2122
def elements_to_r
  warn "#{caller(1)[0]}: warning: Vector#elements_to_r is deprecated"
  map(&:to_r)
end
            
eql?(other) click to toggle source
 
               # File matrix.rb, line 1885
def eql?(other)
  return false unless Vector === other
  @elements.eql? other.elements
end
            
hash() click to toggle source

Returns a hash-code for the vector.

 
               # File matrix.rb, line 1900
def hash
  @elements.hash
end
            
independent?(*vs) click to toggle source

Returns true iff all of vectors are linearly independent.

Vector[1,0].independent?(Vector[0,1])
  => true

Vector[1,2].independent?(Vector[2,4])
  => false
 
               # File matrix.rb, line 1869
def independent?(*vs)
  self.class.independent?(self, *vs)
end
            
inner_product(v) click to toggle source

Returns the inner product of this vector with the other.

Vector[4,7].inner_product Vector[10,1]  => 47
 
               # File matrix.rb, line 1992
def inner_product(v)
  Vector.Raise ErrDimensionMismatch if size != v.size

  p = 0
  each2(v) {|v1, v2|
    p += v1 * v2.conj
  }
  p
end
            
Also aliased as: dot
inspect() click to toggle source

Overrides Object#inspect

 
               # File matrix.rb, line 2157
def inspect
  "Vector" + @elements.inspect
end
            
magnitude() click to toggle source

Returns the modulus (Pythagorean distance) of the vector.

Vector[5,8,2].r => 9.643650761
 
               # File matrix.rb, line 2051
def magnitude
  Math.sqrt(@elements.inject(0) {|v, e| v + e.abs2})
end
            
Also aliased as: r, norm
map() click to toggle source
Alias for: collect
map2(v) click to toggle source

Like #collect2, but returns a Vector instead of an Array.

 
               # File matrix.rb, line 2060
def map2(v, &block) # :yield: e1, e2
  return to_enum(:map2, v) unless block_given?
  els = collect2(v, &block)
  self.class.elements(els, false)
end
            
norm() click to toggle source
Alias for: magnitude
normalize() click to toggle source

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 2074
def normalize
  n = magnitude
  raise ZeroVectorError, "Zero vectors can not be normalized" if n == 0
  self / n
end
            
r() click to toggle source
Alias for: magnitude
size() click to toggle source

Returns the number of elements in the vector.

 
               # File matrix.rb, line 1795
def size
  @elements.size
end
            
to_a() click to toggle source

Returns the elements of the vector in an array.

 
               # File matrix.rb, line 2108
def to_a
  @elements.dup
end
            
to_s() click to toggle source

Overrides Object#to_s

 
               # File matrix.rb, line 2150
def to_s
  "Vector[" + @elements.join(", ") + "]"
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.