【问题标题】:how to map a Eigen::Matrix to std::vector<Eigen::vector>?如何将 Eigen::Matrix 映射到 std::vector<Eigen::vector>?
【发布时间】:2019-07-08 00:39:57
【问题描述】:

例如,如果我有一个大小为 10 列和 3 行的 Eigen::MatrixXd,我如何将其别名为包含 Eigen::Vector3d 的 10 个元素的 std::vector? 当我说别名时,我的意思是使用相同的内存块而不复制。

我知道我可以通过以下方式进行反向映射:

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

但是反过来,如果我有一个 Eigen::Matrix,我尝试将其转换为 Eigen::vector 的向量,但以下代码行编译失败

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

【问题讨论】:

标签: c++ eigen stdvector


【解决方案1】:

这可以使用此处描述的自定义分配器:Is it possible to initialize std::vector over already allocated memory?

为此,您必须将其重新解释为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;

【讨论】:

  • 所以您的意思是Matrix&lt;double,3,Dynamic&gt;::Map(vec.data().data()) = mat;mat 中的数据深度复制到vec?我阅读了Map 的文档,似乎它没有复制内存,我在这里很困惑发生深拷贝的地方......
  • Map 对象仅存储指向vec 缓冲区的指针,深拷贝发生在operator=
  • 所以,我在这里看到这个问题有一些有趣的答案 stackoverflow.com/questions/21917529/… ,是否可以使用自定义分配器为 Eigen::Matrix 实现类似的东西?
  • 我没有想过为此使用自定义分配器,但是这绝对是可能的,只需将 mat.data() 传递给您的自定义分配器!
  • @ggael 还是想不通,你能说得具体点吗?或者如果你可以编辑答案,我会先更新我的问题
猜你喜欢
  • 1970-01-01
  • 2022-01-22
  • 2021-12-13
  • 1970-01-01
  • 2013-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多