Class Vector
In: lib/matrix.rb
Parent: Object

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:

  • [](i)

To enumerate the elements:

  • each2(v)
  • collect2(v)

Vector arithmetic:

  • *(x) "is matrix or number"
  • +(v)
  • -(v)

Vector functions:

Conversion to other data types:

String representations:

Methods

*   +   -   ==   []   []   clone   coerce   collect   collect2   compare_by   covector   each2   elements   eqn?   hash   init_elements   inner_product   inspect   map   map2   new   r   size   to_a   to_s  

Included Modules

ExceptionForMatrix

Public Class methods

Creates a Vector from a list of elements.

  Vector[7, 4, ...]

[Source]

# File lib/matrix.rb, line 1005
  def Vector.[](*array)
    new(:init_elements, array, copy = false)
  end

Creates a vector from an Array. The optional second argument specifies whether the array itself or a copy is used internally.

[Source]

# File lib/matrix.rb, line 1013
  def Vector.elements(array, copy = true)
    new(:init_elements, array, copy)
  end

For internal use.

[Source]

# File lib/matrix.rb, line 1020
  def initialize(method, array, copy)
    self.send(method, array, copy)
  end

Public Instance methods

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

[Source]

# File lib/matrix.rb, line 1120
  def *(x)
    case x
    when Numeric
      els = @elements.collect{|e| e * x}
      Vector.elements(els, false)
    when Matrix
      Matrix.column_vector(self) * x
    else
      s, x = x.coerce(self)
      s * x
    end
  end

Vector addition.

[Source]

# File lib/matrix.rb, line 1136
  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
      s, x = v.coerce(self)
      s + x
    end
  end

Vector subtraction.

[Source]

# File lib/matrix.rb, line 1156
  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
      s, x = v.coerce(self)
      s - x
    end
  end

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

[Source]

# File lib/matrix.rb, line 1085
  def ==(other)
    return false unless Vector === other
    
    other.compare_by(@elements)
  end

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

[Source]

# File lib/matrix.rb, line 1040
  def [](i)
    @elements[i]
  end

Return a copy of the vector.

[Source]

# File lib/matrix.rb, line 1102
  def clone
    Vector.elements(@elements)
  end

FIXME: describe Vector#coerce.

[Source]

# File lib/matrix.rb, line 1248
  def coerce(other)
    case other
    when Numeric
      return Scalar.new(other), self
    else
      raise TypeError, "#{self.class} can't be coerced into #{other.class}"
    end
  end

Like Array#collect.

[Source]

# File lib/matrix.rb, line 1195
  def collect # :yield: e
    els = @elements.collect {
      |v|
      yield v
    }
    Vector.elements(els, false)
  end

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

[Source]

# File lib/matrix.rb, line 1070
  def collect2(v) # :yield: e1, e2
    Vector.Raise ErrDimensionMismatch if size != v.size
    (0 .. size - 1).collect do
      |i|
      yield @elements[i], v[i]
    end
  end

For internal use.

[Source]

# File lib/matrix.rb, line 1095
  def compare_by(elements)
    @elements == elements
  end

Creates a single-row matrix from this vector.

[Source]

# File lib/matrix.rb, line 1234
  def covector
    Matrix.row_vector(self)
  end

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

[Source]

# File lib/matrix.rb, line 1058
  def each2(v) # :yield: e1, e2
    Vector.Raise ErrDimensionMismatch if size != v.size
    0.upto(size - 1) do
      |i|
      yield @elements[i], v[i]
    end
  end
eqn?(other)

Alias for #==

Return a hash-code for the vector.

[Source]

# File lib/matrix.rb, line 1109
  def hash
    @elements.hash
  end

For internal use.

[Source]

# File lib/matrix.rb, line 1027
  def init_elements(array, copy)
    if copy
      @elements = array.dup
    else
      @elements = array
    end
  end

Returns the inner product of this vector with the other.

  Vector[4,7].inner_product Vector[10,1]  => 47

[Source]

# File lib/matrix.rb, line 1181
  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

[Source]

# File lib/matrix.rb, line 1271
  def inspect
    str = "Vector"+@elements.inspect
  end
map(

Alias for collect

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

[Source]

# File lib/matrix.rb, line 1207
  def map2(v) # :yield: e1, e2
    els = collect2(v) {
      |v1, v2|
      yield v1, v2
    }
    Vector.elements(els, false)
  end

Returns the modulus (Pythagorean distance) of the vector.

  Vector[5,8,2].r => 9.643650761

[Source]

# File lib/matrix.rb, line 1219
  def r
    v = 0
    for e in @elements
      v += e*e
    end
    return Math.sqrt(v)
  end

Returns the number of elements in the vector.

[Source]

# File lib/matrix.rb, line 1047
  def size
    @elements.size
  end

Returns the elements of the vector in an array.

[Source]

# File lib/matrix.rb, line 1241
  def to_a
    @elements.dup
  end

Overrides Object#to_s

[Source]

# File lib/matrix.rb, line 1264
  def to_s
    "Vector[" + @elements.join(", ") + "]"
  end

[Validate]