我有一个小问题,但我不知道如何解决。
我们开始吧: 我需要使用多线程处理大特征矩阵。 每个线程都需要访问该矩阵。维度是在程序执行期间指定的,因此我必须在 main() 内部声明它,而不是全局声明。我尝试了不同的解决方案但没有成功。我搜索类似“通过引用传递”之类的内容,但我读到此方法不适用于特征矩阵。 这里有一个小例子。有人可以告诉我如何解决这个问题吗?程序需要快速,所以类似: - 将矩阵保存在文件中,并在每个线程中读取该文件,处理矩阵,将矩阵保存在文件中,从主线程中重新读取文件 - 不是我认为最好的方法...;)有人知道更好的解决方案吗? 非常感谢!
void calc() {
// work on the Matrix
}
int main() {
Eigen::Matrix<bool, a, b> Mat;
// Start some thread(calc);
cout << Mat;
}
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
如果你想修改矩阵并且矩阵可以来自
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;
}
}