[英]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::array
或std::vector
)。 您要执行的操作,从双精度数转换为浮点数, 具有不同 memory 布局的两种不同类型,是显式操作。 您会将向量的大小缩小一半。 不可能通过对相同数据采取不同的观点来实现这一点。
假设Vector3d
和Vector3f
不引入任何填充(对于 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.