• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

EigenMatrix映射到stdV载体和;lt;EigenVectoramp;gt;

用户头像
it1352
帮助10

问题说明

例如,如果我有一个大小为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()))

正确答案

#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;

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /reply/detail/tanfegif
系列文章
更多 icon
同类精品
更多 icon
继续加载