math.net DenseVectors vs DenseMatrix 1xn | NX1

时间:2013-11-12 10:06:20

标签: f# matrix-multiplication mathdotnet

这是非常简单的东西但是,因为我是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]

Matrix-Vector乘法在这里需要太多的自由。我需要执行适当的维度检查。我应该使用DenseMatrix,创建1xn,nx1矩阵吗? 在我的情况下,这基本上会使VectorsDenseVectors变得多余。

1 个答案:

答案 0 :(得分:3)

在库中观察到Matrix-Vector和Vector-Matrix乘法的行为是设计的。仅仅在column类型中区分rowVector向量是不可能的,因此显式的逐向数乘法和逐个矩阵的乘法运算只具有相应的签名:

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

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

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

当在更复杂的表达式中链接操作时,库总是采用“正确”的向量方向,同时实际执行其他维度检查。

如果您出于任何原因明确区分rowcolumn向量,并根据需要携带显式转置的负担,然后使用1-by-nn-by-1矩阵分别代替rowcolumn向量是要走的路。在这种情况下,如果矩阵维度不一致,则库将抛出System.ArgumentException而不是默默地假设“正确”换位。