将Eigen矩阵转换为std::vector<std::array<>>形式

3

如何将Eigen矩阵转换为std::vector<std::array<>>格式? 假设我有一个Eigen矩阵Eigen::MatrixXd A(4,3),是否可以将矩阵A转换为std::vector<std::array<double,3>>格式?


你需要创建一个循环并复制值,因为没有直接的转换可用。 - πάντα ῥεῖ
我不太明白。你能告诉我“copy”是什么意思吗? - galib
“copy”是什么意思?从Eigen::MatrixXd中访问每个值并将其复制到std::vector<std::array<double,3>>中。 - πάντα ῥεῖ
哦哦哦..明白了。你的意思是逐个插入元素。谢谢 :)。 - galib
1个回答

7

您可以使用Eigen::Mapstd::vector<std::array<double,3>>的内存映射到可写的Eigen类型中,例如:

// typedef for brevity, if you need this more often: 
typedef Eigen::Matrix<double, 4, 3, Eigen::RowMajor> Mat43dR;

std::vector<std::array<double,3>> raw_data;
raw_data.resize(4); // allocate memory for 4x3 entries
// Copy A to raw_data:
Mat43dR::Map(raw_data[0].data() ) = A;

当然,您也可以使用 Eigen::Mapraw_data 中读取。还有一些与 Eigen::Map 相关的可选方法:https://eigen.tuxfamily.org/dox/group__TutorialMapClass.html

补充说明: 如果您不知道编译时 A 的大小,您可以这样使用 Dynamic 大小:

typedef Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor> MatXXdR;
std::vector<std::array<double,3>> raw_data; // the `3` must still be known at compile-time
assert(A.cols()==3);
raw_data.resize(A.rows()); // allocate memory for Nx3 entries
// Copy A to raw_data:
MatXXdR::Map(raw_data[0].data(), A.rows(), A.cols() ) = A;

我试图用这种方式定义矩阵 typedef Eigen::Matrix<double, A.rows(), A.cols(), Eigen::RowMajor> Mat43dR;,但是出现了错误。有没有一种方法可以在不硬编码大小的情况下定义矩阵? - galib
你的问题明确涉及到一个 4x3 矩阵,但我添加了一个替代方案,如果你不知道这些。然而,对于 std::array,你需要在编译时知道维度。 - chtz
你可以创建一个 std::vector<std::vector<double>> 这样你就会拥有一个动态大小的二维 double 向量。 - nlhnt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接