5

我正在 Ruby 1.9.3 中实现基本的机器学习算法。

我尝试使用类 Matrix 和 Vector 进行算术。但是当我尝试将一个向量与另一个向量相乘时,它会显示“ExceptionForMatrix::ErrOperationNotDefined: Operation(*) can't be defined: Vector op Vector”。

但是 Ruby 的文档 1.9,3

*(x) 将向量乘以 x,其中 x 是一个数字或另一个向量。

我的代码和输出在这里:

> a = Vector[1,2,3]
=> Vector[1, 2, 3]
> b = Vector[1,2,3]
=> Vector[1, 2, 3]
> a * b
ExceptionForMatrix::ErrOperationNotDefined: Operation(*) can't be defined: Vector op Vector
4

2 回答 2

4

尽管文档明确指出您可以将一个向量乘以另一个向量,但这是荒谬的,并且正如 zisasign 指出的那样,实现不允许这样做。

但是,您可以使用该方法将任一向量转换为单行矩阵covector,然后您可以将其相乘以进行有意义的计算:

a = Vector[1, 2, 3]
b = Vector[10, 100, 1000]

a.covector * b
# => Vector[3210]

a * b.covector
# => Matrix[[10, 100, 1000], [20, 200, 2000], [30, 300, 3000]]
于 2013-05-16T10:56:22.600 回答
2

文档是错误的。当您查看文档中链接的代码时,有

def *(x)
  case x
  when Numeric
    els = @elements.collect{|e| e * x}
    Vector.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

无论如何,将(列)向量乘以(列)向量(如矩阵乘法)是没有意义的。也许你想要inner_product

于 2013-05-16T10:53:14.217 回答