Eigen::Map是否自带存储空间?如何将其映射数据存储到Eigen矩阵中
Eigen::Map使用场景问题解答
核心疑问答复
- 你担心的
output随原始array内容变更而变化的情况不会发生:
你代码中*out = Eigen::Map<Eigen::Matrix3i>(in)使用了Eigen的赋值运算符,该操作会将Map指向的原始数据完整深拷贝到out指向的Eigen::MatrixXi自有存储空间中。赋值完成后临时Map对象销毁,output和原始array不存在任何关联,后续修改array的值完全不会影响output。 - 不能直接返回
Eigen::Map的原因确实是它不持有数据所有权:如果返回的Map绑定的原始内存生命周期短于Map本身,后续访问Map就会触发野指针非法访问问题。
示例代码修正
你提供的示例代码存在几处语法错误,修正后的可运行版本如下:
#include <Eigen/Core> void transformTo33Mat(const int in[], Eigen::MatrixXi* out){ // 将Map重解释的数据深拷贝到out指向的矩阵中 *out = Eigen::Map<Eigen::Matrix3i>(in); } int main(){ int array[9]; for(int i = 0; i < 9; ++i) array[i] = i; Eigen::MatrixXi output; transformTo33Mat(array, &output); // 此时output已经持有独立的拷贝,修改array不会影响output array[0] = 100; return 0; }
场景适配说明
如果你的场景需要用Eigen::Map做更多操作(比如调整存储顺序、reshape、切片、参与矩阵运算等),只需要确保最终将运算结果赋值给实际持有内存的Eigen矩阵类型(比如Matrix3i、MatrixXi等)即可,赋值操作会自动完成数据拷贝,完全脱离对原始输入内存的依赖,符合你的使用需求。
内容的提问来源于stack exchange,提问作者Emilio7773
相关产品推荐
相关产品推荐

