1

这真的很简单,但由于我是 math.net 的菜鸟,我可能需要指出正确的方向:

let a = new DenseVector([| 5.0; 2.0; 3.0; |])
let m = new DenseMatrix(3, 3, 1.0)
let r = a * m 
let r2 = m * a

结果是:

> r;;
val it : DenseVector = seq [10.0; 10.0; 10.0]
> r2;;
val it : DenseVector = seq [10.0; 10.0; 10.0]

矩阵向量乘法在这里太自由了。我需要执行适当的维度检查。我应该只使用DenseMatrix, 创建 1xn, nx1 矩阵吗?Vectors在我的情况下,这基本上是DenseVectors多余的。

4

1 回答 1

3

在库中观察到的矩阵向量和向量矩阵乘法的行为是设计使然。仅在类型中无法区分向量column和向量,因此显式矩阵乘向量和向量矩阵乘运算仅具有各自的签名:rowVector

Matrix.Multiply: Vector -> Vector // matrix-by-vector

Matrix.LeftMultiply: Vector -> Vector // vector-by-matrix

在第一种情况下,参数和结果都是假定的column向量,而在第二种情况下,两者都是假定row的向量。

在更复杂的表达式中链接操作时,该库始终假定“正确”向量方向,同时确实执行其他维度检查。

如果您出于某种原因想要明确区分row向量column并在需要时承担显式转置的负担,那么分别使用1-by-nn-by-1矩阵代替rowcolumn向量是要走的路。在这种情况下,如果矩阵尺寸不一致,库将抛出System.ArgumentException而不是默默地假设“正确”转置。

于 2013-11-12T20:54:38.357 回答