eigen3,如何用密度和稀疏的矩阵实现多态性?

发布于 2025-02-06 17:12:24 字数 401 浏览 3 评论 0原文

我想构建一个阵列,其中包含大型稀疏和密集矩阵的指针。然后,我希望使用多态性对它们进行操作,并避免复制/分配大部分内存。例如,

std::vector<UnkownType*> matrices;

matrices.emplace_back(get_large_dense_matrix_ptr());
matrices.emplace_back(get_large_sparse_matrix_ptr());

Eigen::MatrixXd result(known_size, known_size);
for(mat : matrices){
   result+=*mat;
}

unkowntype应该是什么? 我认为选择使用一系列参考文献或参考包装器,但这是禁止的。

I want to build an array which contains pointers to both large sparse and dense matrices. Then, I desire to operate on them using polymorphism and avoiding to copy/allocate large portions of memory. E.g.

std::vector<UnkownType*> matrices;

matrices.emplace_back(get_large_dense_matrix_ptr());
matrices.emplace_back(get_large_sparse_matrix_ptr());

Eigen::MatrixXd result(known_size, known_size);
for(mat : matrices){
   result+=*mat;
}

What should be the UnkownType type?
I thought in the alternative of using a variant of references or reference wrappers, but this is forbidden.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

森罗 2025-02-13 17:12:24

如果您有C ++ 17,则可以使用 std :: variant


using matrix_variant = std::variant<Eigen::MatrixXd, Eigen::SparseMatrix<double>>;

std::vector<matrix_variant> matrices;

matrices.emplace_back(Eigen::MatrixXd::Zeros(10, 10).eval());
matrices.emplace_back(Eigen::SparseMatrix<double>{});

Eigen::MatrixXd result;
for(const matrix_variant& matrix: matrices) {
    if(std::holds_alternative<Eigen::MatrixXd>(matrix)) {
        const Eigen::MatrixXd& dense = std::get<Eigen::MatrixXd>(matrix);
        result += dense;
    } else if(std::holds_alternative<Eigen::SparseMatrix<double>>(matrix)) {
        const Eigen::SparseMatrix<double>& sparse =
              std::get<Eigen::SparseMatrix<double>>(matrix);
        result += sparse;
    }
}

If you have C++17, you can use std::variant


using matrix_variant = std::variant<Eigen::MatrixXd, Eigen::SparseMatrix<double>>;

std::vector<matrix_variant> matrices;

matrices.emplace_back(Eigen::MatrixXd::Zeros(10, 10).eval());
matrices.emplace_back(Eigen::SparseMatrix<double>{});

Eigen::MatrixXd result;
for(const matrix_variant& matrix: matrices) {
    if(std::holds_alternative<Eigen::MatrixXd>(matrix)) {
        const Eigen::MatrixXd& dense = std::get<Eigen::MatrixXd>(matrix);
        result += dense;
    } else if(std::holds_alternative<Eigen::SparseMatrix<double>>(matrix)) {
        const Eigen::SparseMatrix<double>& sparse =
              std::get<Eigen::SparseMatrix<double>>(matrix);
        result += sparse;
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文