gpt4 book ai didi

c++ - 在Eigen中具有编译时已知大小的大矩阵:MatrixXd或Matrix

转载 作者:行者123 更新时间:2023-12-03 07:09:08 26 4
gpt4 key购买 nike

我正在使用Eigen编写一些C++线性代数代码。我必须处理一些不太小的矩阵(大于4x4,但小于50x50,如果这样的话),它们的大小在编译时就完全知道了。

我想从Eigen库可以围绕矩阵操作执行的编译时大小检查中受益,每当代码中发生不同大小的矩阵之和时,该检查就会触发错误,但是我也担心可能发生的错误如果我不明确地分配那些相对较大的对象,可能会滥用堆栈。性能方面的问题不会困扰我。

Eigen documentation简短介绍了固定大小和动态大小矩阵,在此讨论了我以前的关注点,但是不幸的是,我并不想维护编译时检查方面的重点。该文档建议:

Use fixed sizes for very small sizes where you can, and use dynamic sizes for larger sizes or where you have to.



最后,我的问题是:Eigen中是否有一种方法可以动态分配具有编译时已知大小的Matrix,以保留我们对标准固定大小矩阵进行的常规编译时检查?

像这样:
using MyMatrix = MatrixXd<12, 15>; // Currently I can only do Matrix<double, 12, 15>
using MyVector = MatrixXd<14, 1>;
MyMatrix M;
MyVector v;
auto w = M * v; // This should trigger an INVALID_MATRIX_PRODUCT error

其中 MatrixXd<n, m>是我想使用的假设动态分配的,编译时已知的大小矩阵!

最佳答案

您可以滥用提供类矩阵包装器的Eigen类的继承:

  • Eigen::Block
    struct MatrixHelper { Eigen::MatrixXd mat; };

    template <int Rows, int Cols>
    struct CheckedDynamicMatrix
    : MatrixHelper, Eigen::Block<Eigen::MatrixXd, Rows, Cols>
    {
    using Block = Eigen::Block<Eigen::MatrixXd, Rows, Cols>;
    CheckedDynamicMatrix() :
    MatrixHelper { Eigen::MatrixXd(Rows, Cols) },
    Block { mat.topLeftCorner<Rows, Cols>() }
    {}
    };
  • Eigen::Map
    template <int Rows, int Cols>
    struct CheckedDynamicMatrix
    : Eigen::Map<Eigen::Matrix<double, Rows, Cols>>
    {
    using Map = Eigen::Map<Eigen::Matrix<double, Rows, Cols>>;
    std::unique_ptr<double[]> data;
    CheckedDynamicMatrix() :
    Map { nullptr },
    data { new double[Rows * Cols] }
    {
    new (static_cast<Map*>(this)) Map(data.get(), Rows, Cols);
    }
    };

  • 为了获得完整的功能,还应该按照 Eigen: Inheriting from Matrix中所述添加必要的构造函数和赋值运算符

    关于c++ - 在Eigen中具有编译时已知大小的大矩阵:MatrixXd或Matrix <double,n,m>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61815014/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com