如何通过引用使用 Eigen::Matrix

问题描述 投票:0回答:2

我有一个小问题,但我不知道如何解决。

我们开始吧: 我需要使用多线程处理大特征矩阵。 每个线程都需要访问该矩阵。维度是在程序执行期间指定的,因此我必须在 main() 内部声明它,而不是全局声明。我尝试了不同的解决方案但没有成功。我搜索类似“通过引用传递”之类的内容,但我读到此方法不适用于特征矩阵。 这里有一个小例子。有人可以告诉我如何解决这个问题吗?程序需要快速,所以类似: - 将矩阵保存在文件中,并在每个线程中读取该文件,处理矩阵,将矩阵保存在文件中,从主线程中重新读取文件 - 不是我认为最好的方法...;)有人知道更好的解决方案吗? 非常感谢!

void calc() {
    // work on the Matrix
}

int main() {
    Eigen::Matrix<bool, a, b> Mat;
    // Start some thread(calc);
    cout << Mat;
}
c++11 matrix eigen
2个回答
1
投票

Si!特征矩阵可以作为参考传递。

这是一个工作示例:

#include <iostream>
#include <Eigen/Dense>

void calc(Eigen::MatrixXf& mat) {
    mat = Eigen::MatrixXf::Constant(mat.rows(), mat.cols(), 1.0);
}

int main() {
    Eigen::MatrixXf Mat;
    Mat = Eigen::Matrix4f::Identity();
    std::cout << Mat << std::endl;
    calc(Mat);
    std::cout << Mat << std::endl;
}
  • 输出:

    1 0 0 0    
    0 1 0 0    
    0 0 1 0    
    0 0 0 1
    
    1 1 1 1
    1 1 1 1
    1 1 1 1
    1 1 1 1
    

0
投票

如果你想修改矩阵并且矩阵可以来自

Eigen::MatrixXd
Eigen::Map<Eigen::MatrixXd>
,那么你只能使用
Eigen::Ref<Eigen::MatrixXd>
。如果您想通过将
std::vector
映射到
Eigen::VectorXd
,或将
std::vector<std::vector<>>
映射到
Eigen::MatrixXd
而不进行复制来重构某些遗留项目,这种情况很常见。

#include <Eigen/Dense>
#include <iostream>
#include <vector>

// // ERROR:
// // candidate function not viable: no known conversion from
// // 'Eigen::Map<Eigen::MatrixXd>' (aka 'Map<Matrix<double, Dynamic,
// // Dynamic>>') to 'Eigen::MatrixXd &' (aka 'Matrix<double, Dynamic, Dynamic>
// // &') for 1st argument
// void calc(Eigen::MatrixXd &eigen_mat) { eigen_mat *= 2.0; }

// OK
void calc(Eigen::Ref<Eigen::MatrixXd> eigen_mat) { eigen_mat *= 2.0; }

int main() {
  std::vector<double> vec(9, 1.0);
  { // OK for both `Eigen::MatrixXd &` and `Eigen::Ref<Eigen::MatrixXd>`
    Eigen::MatrixXd eigen_mat = Eigen::MatrixXd::Constant(3, 3, 1.0);
    calc(eigen_mat);
    std::cout << "MatrixXd:\n" << eigen_mat << std::endl;
  }
  { // OK only for `Eigen::Ref<Eigen::MatrixXd>`
    Eigen::Map<Eigen::MatrixXd> eigen_mat(vec.data(), 3, 3);
    calc(eigen_mat);
    std::cout << "Map<MatrixXd>:\n" << eigen_mat << std::endl;
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.