如何将 Eigen::Matrix 映射到 std::vector<Eigen::vector>?

how to map a Eigen::Matrix to std::vector<Eigen::vector>?

本文关键字:Eigen vector gt lt Matrix 映射 std      更新时间:2023-10-16

,例如,如果我的 Eigen::MatrixXd大小为10列和3行,我该如何将其与Eigen::Vector3d的10个元素的std::vector相提并论?当我说别名时,是指在不复制的情况下使用相同的内存块。

我知道我可以通过以下内容进行反向映射:

std::vector<Vector3d> v(10);
...
Map<Matrix<double,3,Dynamic> >  m(v.data().data(), 3, 10);

但是,如果我有一个eigen ::矩阵,我尝试将其转换为eigen :: vector的向量,但是以下代码行失败了

Eigen::Matrix2Xd points;
...
std::vector<Eigen::Vector2d> v_points(points.data()
    Eigen::aligned_allocator<Eigen::vector2d>(points_data()))

使用自定义分配器,如上所述:是否可以通过已分配的内存初始化std ::向量?

为此,您必须将其重新解释为Vector3d*

Vector3d* buf = reinterpret_cast<Vector3d*>(mat.data());

然后将其传递给您的自定义分配器:

std::vector<Vector3d, PreAllocator<Vector3d>> my_vec(10, PreAllocator<Vector3d>(buf, 10));

另一个选项是将其包装在某些视图中,例如std::vector,例如gsl::span

gsl::span<Vector3d> view(buf,mat.cols());

在这两种情况下,mat对象在std::vectorspan的整个生命中必须保持活力。

有关完整性,您也可以在std::vector中深入复制它:

std::vector<Vector3d> v(10);
Matrix<double,3,Dynamic>::Map(v.data().data(),3,10) = mat;