class Vector
Public Class Methods
Returns a concatenated Vector
Vector.concat(Vector[1,2,3], Vector[4,5,6]) => Vector[1, 2, 3, 4, 5, 6]
# File lib/extendmatrix.rb, line 61 def concat(*args) Vector.elements(args.inject([]){|ac,v| ac+v.to_a}, false) end
Stabilized Gram-Schmidt process (en.wikipedia.org/wiki/Gram-Schmidt_process#Algorithm)
# File lib/extendmatrix.rb, line 200 def self.gram_schmidt(*vectors) v = vectors.clone for j in 0...v.size for i in 0..j-1 v[j] -= v[i] * v[j].inner_product(v[i]) end v[j] /= v[j].norm end v end
Public Instance Methods
Return the vector divided by a scalar
# File lib/extendmatrix.rb, line 143 def / (c) map {|e| e.quo(c)} end
Returns the value of an index vector or a Vector with the values of a range
v = Vector[1, 2, 3, 4]
v[0] => 1 v[0..2] => Vector[1, 2, 3]
# File lib/extendmatrix.rb, line 22 def [](i) case i when Range Vector[*to_a.slice(i)] else index(i) end end
Sets a vector value/(range of values) with a new value/(values from a vector) v = Vector[1, 2, 3] v = 9 => Vector[1, 2, 9] v = Vector[9, 9, 9, 9, 9] => v: Vector[1, 9, 9]
# File lib/extendmatrix.rb, line 43 def []=(i, v) case i when Range (self.size..i.begin - 1).each{|e| self[e] = 0} # self.size must be in the first place because the size of self can be modified [v.size, i.entries.size].min.times {|e| self[e + i.begin] = v[e]} (v.size + i.begin .. i.end).each {|e| self[e] = 0} else @elements[i]=v end end
Changes the elements of vector and returns a Vector
# File lib/extendmatrix.rb, line 69 def collect! els = @elements.collect! {|v| yield(v)} Vector.elements(els, false) end
Iterates the elements of a vector
# File lib/extendmatrix.rb, line 77 def each (0...size).each {|i| yield(self[i])} nil end
Computes the Householder vector (MC, Golub, p. 210, algorithm 5.1.1)
# File lib/extendmatrix.rb, line 159 def house s = self[1..length-1] sigma = s.inner_product(s) v = clone; v[0] = 1 if sigma == 0 beta = 0 else mu = Math.sqrt(self[0] ** 2 + sigma) if self[0] <= 0 v[0] = self[0] - mu else v[0] = - sigma.quo(self[0] + mu) end v2 = v[0] ** 2 beta = 2 * v2.quo(sigma + v2) v /= v[0] end return v, beta end
Magnitude or length of the vector Equal to sqrt(sum(x_i^2))
# File lib/extendmatrix.rb, line 33 def magnitude Math::sqrt(to_a.inject(0) {|ac, v| ac+(v**2)}) end
Returns the maximum element of a vector
# File lib/extendmatrix.rb, line 85 def max to_a.max end
Returns the minimum element of a vector
# File lib/extendmatrix.rb, line 92 def min to_a.min end
Returns the p-norm of a vector
# File lib/extendmatrix.rb, line 104 def norm(p = 2) Norm.sqnorm(self, p) ** (1.quo(p)) end
Returns the infinite-norm
# File lib/extendmatrix.rb, line 111 def norm_inf [min.abs, max.abs].max end
Return the vector normalized
# File lib/extendmatrix.rb, line 192 def normalize self.quo(self.norm) end
Projection operator (en.wikipedia.org/wiki/Gram-Schmidt_process#The_Gram.E2.80.93Schmidt_process)
# File lib/extendmatrix.rb, line 183 def proj(v) vp = v.inner_product(self) vp = Float vp if vp.is_a?(Integer) self * (vp / inner_product(self)) end
Returns a slice of vector
# File lib/extendmatrix.rb, line 118 def slice(*args) Vector[*to_a.slice(*args)] end
Sets a slice of vector
# File lib/extendmatrix.rb, line 131 def slice=(args) case args[1] when Range slice_set(args[0], args[1].begin, args[1].last) else slice_set(args[0], args[1], args[2]) end end
# File lib/extendmatrix.rb, line 122 def slice_set(v, b, e) for i in b..e self[i] = v[i-b] end end
Returns the sum of values of the vector
# File lib/extendmatrix.rb, line 98 def sum to_a.inject(&:+) end
Return the matrix column coresponding to the vector transpose
# File lib/extendmatrix.rb, line 150 def transpose Matrix[self.to_a] end