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.
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
#map
#map2(v)
#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 1005
def Vector.[](*array)
new(:init_elements, array, copy = false)
end
Multiplies the vector by x, where x is a number
or another vector.
# File 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.
# File 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.
# File 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.
# File 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.
# File matrix.rb, line 1040
def [](i)
@elements[i]
end
Return a copy of the vector.
# File matrix.rb, line 1102
def clone
Vector.elements(@elements)
end
FIXME: describe #coerce.
# File 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.
# File 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.
# File 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.
# File matrix.rb, line 1095
def compare_by(elements)
@elements == elements
end
Creates a single-row matrix from this vector.
# File matrix.rb, line 1234
def covector
Matrix.row_vector(self)
end
Iterate over the elements of this vector and v in conjunction.
# File 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
Return a hash-code for the vector.
# File matrix.rb, line 1109
def hash
@elements.hash
end
For internal use.
# File 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
# File 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
# File matrix.rb, line 1271
def inspect
str = "Vector"+@elements.inspect
end
Returns the modulus (Pythagorean distance) of the vector.
Vector[5,8,2].r => 9.643650761
# File 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.
# File matrix.rb, line 1047
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 see Improve the docs, or visit Documenting-ruby.org.