【问题标题】:MathNET Matrix CastingMathNET 矩阵转换
【发布时间】:2014-01-19 16:48:33
【问题描述】:

我最近开始使用 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)) 进行投射,有没有办法为每个操作都这样做?

【问题讨论】:

    标签: c# matrix math.net mathnet-numerics


    【解决方案1】:

    类型层次结构: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&lt;double&gt;.Build) 直接使用泛型类型构造矩阵和向量,因此唯一要打开的命名空间是 MathNet.Numerics.LinearAlgebra

    【讨论】:

    • var 是你的朋友。
    • 我知道var确实可以在这里使用。但是,在这种情况下使用var 可能会在Vectors 和Matrixs 之间引入不必要的歧义。谢谢...
    • 我发现需要使用:using MathNet.Numerics.LinearAlgebra.Generic;
    • @Killercam 您可以在Codeplex 上下载v3.0.0-alpha8 的二进制文件,或者直接查看匹配的tagged revision on Github
    猜你喜欢
    • 2016-10-02
    • 1970-01-01
    • 1970-01-01
    • 2015-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多