繁体   English   中英

从 std::vector 转换<eigen::vector3d>到 std::vector<eigen::vector3f></eigen::vector3f></eigen::vector3d>

[英]Conversion from std::vector<Eigen::Vector3d> to 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,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<> class,但并没有真正找到解决方案。

我不认为你在问什么是可能的。 Eigen::Map允许您构建 Eigen 数据结构而无需复制或移动,它仅查看现有的连续数据(通常来自std::arraystd::vector )。 您要执行的操作,从双精度数转换为浮点数, 具有不同 memory 布局的两种不同类型,是显式操作。 您会将向量的大小缩小一半。 不可能通过对相同数据采取不同的观点来实现这一点。

假设Vector3dVector3f不引入任何填充(对于 Eigen 支持的所有编译器都是如此),您可以将Eigen::Map<const Matrix3Xd>和 .cast .cast<float>()用于Eigen::Map<Matrix3Xf>在目标向量上:

std::vector< Eigen::Vector3d> tf{ {1,1,1},{1,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(), 3, tf.size()).cast<float>();

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM