Eigen::Map 拷贝

Map是Eigen中一个非常有用却又很容易被忽略的类,可以用它避免很多不必要的内存拷贝,举个例子,你手头有一个std::vector<Eigen::Vector3d> pts的数据,你需要将这个数据转化成一个n*3的矩阵,以便进行后续的矩阵计算,你会怎么做?

最直接的想法是这样的:

 MatrixXd mat(pts.size(), 3);
 for(int i = 0; i < pts.size(); ++i){
     mat.row(i) << pts[i];
 }

但问题是当pts数据量较大时,通过这种方式会在数据拷贝上浪费不少时间。其实完全可通过Map避免这种不必要的时间浪费。用上Map后上述代码用一句即可代替:

 Map<MatrixXd, 0, OuterStride<3>> mat(pts.data()->data(), pts,size(), 3);

是不是很简单,同时还不会有内存构造和赋值的时间消耗,怎么做到的呢?

可以参考下面的链接:

https://zhuanlan.zhihu.com/p/348622852

http://eigen.tuxfamily.org/dox-devel/classEigen_1_1Map.html

posted @ 2022-12-13 23:26  blogzzt  阅读(227)  评论(0编辑  收藏  举报