2

我最近开始使用 MathNET 库,它很棒。我正在大量使用矩阵和向量。该库运行良好,但我发现我必须一直使用强制转换;这方面的一个例子是:

using MathNet.Numerics.LinearAlgebra.Double;
...
Matrix P = (DenseMatrix)(T.Multiply(P.TransposeAndMultiply(T)) + 
    R.Multiply(Q.TransposeAndMultiply(R)));

或者

using MathNet.Numerics.LinearAlgebra.Double;
...
Vector a, v, y;
Matrix F, K, Z;
...
Matrix FI = (DenseMatrix)F.Inverse();
if (FI != null)
    K = (DenseMatrix)K.Multiply(FI);
...
v = (DenseVector)(y - Z.Multiply(a));

为什么我必须使用 ( (DenseMatrix)/ (DenseVector)) 进行投射,有没有办法为每个操作都这样做?

4

1 回答 1

3

类型层次结构:Matrix<double> <- Double.Matrix <- Double.DenseMatrix

你真的需要明确地使用像 Double.Matrix 或 Double.DenseMatrix 这样的特殊类型,而不是通用的矩阵和向量类型吗?

对于 v3,我们建议始终使用泛型类型。这种方式在大多数情况下根本不需要强制转换。您的示例将如下所示:

using MathNet.Numerics.LinearAlgebra;
Matrix<double> P = T*P.TransposeAndMultiply(T) + R*Q.TransposeAndMultiply(R);

var FI = F.Inverse();
K = K*FI
v = y - Z*a

您还可以使用新的构建器 ( Matrix<double>.Build) 直接使用泛型类型构造矩阵和向量,因此唯一要打开的命名空间是MathNet.Numerics.LinearAlgebra.

于 2014-01-02T16:38:53.377 回答