从 std::vector<Eigen::Vector3d> 转换为 std::vector<Eigen::Vector3f>

问题描述

我遇到了要从 std::vector<Eigen::Vector3d> 转换为 std::vector<Eigen::Vector3f> 的问题。我想知道是否有一个解决方案,我不必遍历这些点。

// mapping using iteration
std::vector< Eigen::Vector3d> tf{ {1,1,1},{1,1} };
std::vector< Eigen::Vector3f> tf2;
tf2.reserve(tf.size());
std::transform(tf.begin(),tf.end(),std::back_inserter(tf2),[](const Eigen::Vector3d& p) {
    return p.cast<float>();
});

我尝试了一些诸如 tf.data() 之类的东西并尝试进行转换,但我没有找到解决方案。我还研究了 Eigen::Map<> 类,但没有真正找到解决方案。

解决方法

我不认为你问的是可能的。 Eigen::Map 允许您在无需复制或移动的情况下构建特征数据结构,它仅查看现有的连续数据(通常来自 std::arraystd::vector)。您要执行的操作(从双精度转换为浮点数 two distinct types with different memory layouts)是一个显式操作。您会将向量的大小缩小一半。对同一数据采取不同的看法是不可能实现这一点的。

,

假设 Vector3dVector3f 不引入任何填充(这适用于 Eigen 支持的所有编译器),您可以使用 Eigen::Map<const Matrix3Xd>.cast<float>()目标向量上的 Eigen::Map<Matrix3Xf>

std::vector< Eigen::Vector3d> tf{ {1,1,1},{1,1} };
std::vector< Eigen::Vector3f> tf2(tf.size()); // target needs to be actually allocated

Eigen::Matrix3Xf::Map(tf2[0].data(),3,tf2.size())
  = Eigen::Matrix3Xd::Map(tf[0].data(),tf.size()).cast<float>();

随着即将到来的 Eigen 3.4 分支,您还可以在 casted-map 上使用迭代器,如下所示:

Eigen::Map<Eigen::Matrix3Xd> input(tf[0].data(),tf.size());
std::vector<Eigen::Vector3f> tf2(input.cast<float>().colwise().begin(),input.cast<float>().colwise().end());