特征值:大步在arra中映射非连续数据

时间:2019-04-03 16:33:28

标签: eigen eigen3

我在内存中有一个数据数组(双*),看起来像:

[x0,y0,z0,junk,x1,y1,z1,junk,...]

我想将其映射到特征向量,并通过执行以下操作来实际上删除垃圾值:

Eigen::Map<
  Eigen::Matrix<double, Eigen::Dynamic, 1, Eigen::ColMajor>,
  Eigen::Unaligned,
  Eigen::OuterStride<4>
  >

但是它不起作用,因为外部步幅似乎仅限于2D矩阵。

有什么窍门可以做我想做的事吗?

非常感谢!

2 个答案:

答案 0 :(得分:1)

使用Eigen的头部,可以将其映射为2D矩阵,然后将其查看为1D向量:

auto m1 = Matrix<double,3,Dynamic>::Map(ptr, 3, n, OuterStride<4>());
auto v = m1.reshaped(); // new in future Eigen 3.4

但是请注意,访问此类v涉及昂贵的整数除法/模运算。

答案 1 :(得分:0)

如果您想要与Eigen 3.3兼容的解决方案,则可以执行以下操作

VectorXd convert(double const* ptr, Index n)
{
    VectorXd res(n*3);
    Matrix3Xd::Map(res.data(), 3, n) = Matrix4Xd::Map(ptr, 4, n).topRows<3>();
    return res;
}

但是,这当然会复制您可能想要避免的数据。

或者,您应该考虑是否可以将数据作为3xN数组/矩阵而不是平面向量来访问(确实取决于您的实际操作)。