Eigen:用步幅映射数组中的非连续数据
Eigen: map non-continous data in an arra with stride
我在内存中有一个数据数组 (double *),如下所示:
[x0,y0,z0,junk,x1,y1,z1,junk,...]
我想将它映射到一个 Eigen 向量,并通过执行以下操作来虚拟地删除垃圾值:
Eigen::Map<
Eigen::Matrix<double, Eigen::Dynamic, 1, Eigen::ColMajor>,
Eigen::Unaligned,
Eigen::OuterStride<4>
>
但它不起作用,因为outerstride似乎仅限于二维矩阵。
有什么技巧可以达到我的目的吗?
非常感谢!
有了Eigen的head,就可以把它映射成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
涉及昂贵的整数 division/modulo。
如果你想要一个与 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 array/matrix 而不是平面向量来访问(实际上取决于您实际在做什么)。
我在内存中有一个数据数组 (double *),如下所示:
[x0,y0,z0,junk,x1,y1,z1,junk,...]
我想将它映射到一个 Eigen 向量,并通过执行以下操作来虚拟地删除垃圾值:
Eigen::Map<
Eigen::Matrix<double, Eigen::Dynamic, 1, Eigen::ColMajor>,
Eigen::Unaligned,
Eigen::OuterStride<4>
>
但它不起作用,因为outerstride似乎仅限于二维矩阵。
有什么技巧可以达到我的目的吗?
非常感谢!
有了Eigen的head,就可以把它映射成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
涉及昂贵的整数 division/modulo。
如果你想要一个与 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 array/matrix 而不是平面向量来访问(实际上取决于您实际在做什么)。