关于Eigen::Map未绑定原始数据反而复制数据的技术疑问
Eigen::Map 数据拷贝问题的解决方法
你的问题核心是误用了Eigen::Map的类型声明方式,导致触发了数据拷贝,而非直接绑定原数组。以下是具体的原因和修正方案:
错误根源
你可能是将ArrayXf::Map()的结果赋值给了普通的Eigen::ArrayXf(或VectorXf)对象,这种写法会触发Eigen的拷贝构造函数,把Map指向的原始数组数据复制到新创建的Eigen数组对象中,自然两者的修改不会互相影响。
举个错误写法的例子:
float raw_arr[] = {1.0f, 2.0f, 3.0f}; // 错误:临时Map对象被拷贝到ArrayXf实例,产生独立数据副本 Eigen::ArrayXf eig_arr = Eigen::ArrayXf::Map(raw_arr, 3);
正确用法
你需要直接将变量声明为Eigen::Map<Eigen::ArrayXf>(对应Vector则用Eigen::Map<Eigen::VectorXf>)类型,这样才能让Eigen对象直接绑定原始数组,不产生拷贝:
float raw_arr[] = {1.0f, 2.0f, 3.0f}; // 正确:Map对象直接绑定原始数组,无数据拷贝 Eigen::Map<Eigen::ArrayXf> eig_arr(raw_arr, 3);
此时修改eig_arr的元素,原始数组raw_arr会同步变化,反之亦然。你可以通过打印地址验证:
// 两者指向的内存地址应当完全一致 std::cout << "Raw array address: " << raw_arr << std::endl; std::cout << "Map data address: " << eig_arr.data() << std::endl;
额外注意事项
- Map本身是轻量级包装,仅持有指针和尺寸信息,所以Map对象自身的内存地址和原始数组不同是正常的,关键看
data()返回的指向数据的地址。 - 避免隐式转换:如果需要传递Map对象给函数,确保函数参数是
const Eigen::Map<...>&或Eigen::Map<...>&类型,而非普通的Array/Vector类型,否则会触发拷贝。
内容的提问来源于stack exchange,提问作者Buzz
相关产品推荐
相关产品推荐

