Ruby 2.4

Vector

Vector 类

Parent:ObjectIncluded modules:Enumerable

所述Vector类表示的数学向量,这是在自己的权利是有用的,并且还构成了矩阵的行或列。

方法目录

创建一个 Vector:

  • ::[]

  • ::elements(array, copy = true)

  • ::basis(size: n, index: k)To access elements:

  • [](i)

列举元素:

  • each2(v)

  • collect2(v)

载体的性质:

  • angle_with(v)

  • ::independent?

  • independent?(*vs)Vector arithmetic:

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

  • #+(v)

  • #-(v)

  • #/(v)

  • #+@

  • #-@Vector functions:

  • inner_product(v), dot(v)

  • cross_product(v), cross(v)

  • collect

  • magnitude

  • map

  • map2(v)

  • norm

  • normalize

  • r

  • round

  • size

转换为其他数据类型:

  • covector

  • to_a

  • coerce(other)String representations:

  • to_s

  • inspect

属性

elementsR

INSTANCE CREATION

公共类方法

Show source

从元素列表创建一个 Vector。

Vector[7, 4, ...]

# File lib/matrix.rb, line 1744 def Vector.[](*array) new convert_to_array(array, false) end

basis(size:, index:) Show source

返回一个标准基础 - n矢量,其中 k 是索引。

Vector.basis(size:, index:) # => Vector[0, 1, 0]

# File lib/matrix.rb, line 1761 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) Show source

从数组创建一个向量。可选的第二个参数指定数组本身或副本是否在内部使用。

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

independent?(*vs) Show source

返回true如果所有向量都是线性无关的。

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

# File lib/matrix.rb, line 1861 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) Show source

::new是私人的; 使用 Vector [] 或 :: elements 来创建。

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

公共实例方法

*(x) Show source

将矢量乘以x,其中x是数字或矩阵。

# File lib/matrix.rb, line 1921 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) Show source

矢量添加。

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

+@() Show source

# File lib/matrix.rb, line 1986 def +@ self end

-(v) Show source

矢量减法。

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

-@() Show source

# File lib/matrix.rb, line 1990 def -@ collect {|e| -e } end

/(x) Show source

矢量分割。

# File lib/matrix.rb, line 1974 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) Show source

返回true两个向量具有相同顺序的相同元素。

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

Show source

返回i矢量的元素编号(从零开始)。

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

另外别名为:element, component

angle_with(v) Show source

返回与另一个向量的角度。结果在 0 ... Math :: PI 内。

Vector[1,0].angle_with(Vector[0,1]) # => Math::PI / 2

# File lib/matrix.rb, line 2095 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() Show source

返回矢量的副本。

# File lib/matrix.rb, line 1903 def clone self.class.elements(@elements) end

coerce(other) Show source

方法为 Ruby 类型强制提供支持。Ruby 使用这种强制机制来处理混合类型的数字操作:它旨在找到操作符的两个操作数之间的兼容通用类型。另请参阅 Numeric#coerce。

# File lib/matrix.rb, line 2144 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() { |e| ... } Show source

Like Array#collect.

# File lib/matrix.rb, line 2050 def collect(&block) # :yield: e return to_enum(:collect) unless block_given? els = @elements.collect(&block) self.class.elements(els, false) end

另外别名为:map

collect2(v) { |e1, e2| ... } Show source

收集(如在 Enumerable#collect 中)在这个向量的元素上和v结合使用。

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

别名为:[]

covector() Show source

从这个向量创建一个单行矩阵。

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

cross(*vs)

别名为:cross_product

cross_product(*vs) Show source

返回此向量与其他向量的叉积。

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

它被推广到其他维度来返回垂直于参数的向量。

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 lib/matrix.rb, line 2025 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

还有别名:cross

dot(v)

别名为:inner_product

each(&block) Show source

遍历这个向量的元素

# File lib/matrix.rb, line 1816 def each(&block) return to_enum(:each) unless block_given? @elements.each(&block) self end

each2(v) { |e1, e2| ... } Show source

迭代此矢量的元素和v结合使用。

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

Alias for: []

elements_to_f() Show source

# File lib/matrix.rb, line 2122 def elements_to_f warn "#{caller(1)[0]}: warning: Vector#elements_to_f is deprecated" map(&:to_f) end

elements_to_i() Show source

# File lib/matrix.rb, line 2127 def elements_to_i warn "#{caller(1)[0]}: warning: Vector#elements_to_i is deprecated" map(&:to_i) end

elements_to_r() Show source

# File lib/matrix.rb, line 2132 def elements_to_r warn "#{caller(1)[0]}: warning: Vector#elements_to_r is deprecated" map(&:to_r) end

eql?(other) Show source

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

hash() Show source

返回矢量的散列码。

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

independent?(*vs) Show source

返回true如果所有向量都是线性无关的。

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

# File lib/matrix.rb, line 1879 def independent?(*vs) self.class.independent?(self, *vs) end

inner_product(v) Show source

返回此矢量与另一个的内积。

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

# File lib/matrix.rb, line 2002 def inner_product(v) Vector.Raise ErrDimensionMismatch if size != v.size p = 0 each2(v) {|v1, v2| p += v1 * v2.conj } p end

另外别名为:dot

inspect() Show source

覆盖对象#检查

# File lib/matrix.rb, line 2167 def inspect "Vector" + @elements.inspect end

magnitude() Show source

返回矢量的模量(毕达哥拉斯距离)。

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

# File lib/matrix.rb, line 2061 def magnitude Math.sqrt(@elements.inject(0) {|v, e| v + e.abs2}) end

还有别名:r,norm

map()

别名为:collect

map2(v) { |e1, e2| ... } Show source

像#collect2 一样,但返回一个 Vector 而不是一个 Array。

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

别名为:magnitude

normalize() Show source

返回一个具有相同方向但具有标准1的新矢量。

v = Vector[5,8,2].normalize # => Vector[0.5184758473652127, 0.8295613557843402, 0.20739033894608505] v.norm => 1.0

# File lib/matrix.rb, line 2084 def normalize n = magnitude raise ZeroVectorError, "Zero vectors can not be normalized" if n == 0 self / n end

r()

别名为:magnitude

round(ndigits=0) Show source

返回一个具有四舍五入到给定精度的条目的向量(请参阅 Float#round)

# File lib/matrix.rb, line 1798 def round(ndigits=0) map{|e| e.round(ndigits)} end

size() Show source

返回矢量中元素的数量。

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

to_a() Show source

返回数组中向量的元素。

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

to_s() Show source

Overrides Object#to_s

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

私有实例方法

[]=(i, v) Show source

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

另外别名为:set_element,set_component

set_component(i, v)

Alias for: []=

set_element(i, v)

Alias for: []=