如何用Eigen::Map将float指针转为Eigen::VectorX<Eigen::Vector3<float>>视图?
如何将float原始指针映射为Eigen::VectorX<Eigen::Vector3>的视图
直接使用Eigen::Map<Eigen::VectorX<Eigen::Vector3<float>>>无法实现,因为Eigen的Map模板仅支持映射到标量类型构成的矩阵/向量,而VectorX<Vector3f>是嵌套的向量类型,不在默认支持范围内。但可以通过以下两种方式实现内存视图(无拷贝,直接复用原始指针的内存):
方法1:映射为矩阵,按列访问Vector3f
VectorX<Vector3f>的内存布局等价于列优先的3×n矩阵(每个Vector3f对应矩阵的一列),因此可以直接将原始指针映射为Eigen::Matrix<float, 3, Eigen::Dynamic>,通过列操作获取目标视图:
const int n = ...; // 你的Vector3f元素数量 auto vec_array_view = Eigen::Map<Eigen::Matrix<float, 3, Eigen::Dynamic>>(data, 3, n); // 访问第i个Vector3f(无拷贝,直接操作原始内存) Eigen::Vector3f& vec_i = vec_array_view.col(i);
方法2:自定义轻量级视图类
如果需要更贴近VectorX<Vector3f>的接口(比如用[]直接访问元素),可以封装矩阵映射实现自定义视图:
class Vector3ArrayView { public: // 构造函数:绑定原始指针和元素数量 Vector3ArrayView(float* data, int count) : mat_map_(data, 3, count) {} // 非const访问 Eigen::Vector3f& operator[](int idx) { return mat_map_.col(idx); } // const访问 const Eigen::Vector3f& operator[](int idx) const { return mat_map_.col(idx); } // 获取元素总数 int size() const { return mat_map_.cols(); } private: Eigen::Map<Eigen::Matrix<float, 3, Eigen::Dynamic>> mat_map_; }; // 使用示例 Vector3ArrayView v(data, n); Eigen::Vector3f& first_vec = v[0];
这两种方式都不会拷贝原始数据,完全基于原始指针的内存创建视图,性能和直接操作原始指针一致。
内容的提问来源于stack exchange,提问作者0xbadf00d
相关产品推荐
相关产品推荐

