Eigen笔记——默认列优先的存储方式
C++数据转换到Eigen时(Eigen::Map),要注意,Eigen默认按列优先存储。列优先因为存储位置相邻会比行优先更快些。
注意:当用输入运算符<<时,都是一行一行输入,不管该矩阵是否是指定的行优先还是列优先.
测试代码:
//无论设置的是行优先还是列优先,输入<<后,都是行优先排列 Eigen::Matrix<float,3,2, Eigen::RowMajor> col_x1; Eigen::Matrix<float,3,2, Eigen::ColMajor> col_x2; col_x1 << 1, 2, 3, 4, 5, 6; col_x2 << 1, 2, 3, 4, 5, 6; std::cout << "row major 1:\n" << col_x1 << std::endl; std::cout << "col major 2:\n" << col_x2 << std::endl; // demo2 c++数组传入给Eigen后,默认按列排 float arr[6] = {1,2,3,4,5,6}; Eigen::Map<Eigen::Matrix<float,3,2>> col_x3(arr); Eigen::Map<Eigen::Matrix<float,3,2, Eigen::RowMajor>> col_x4(arr); std::cout << "col major 3:\n" << col_x3 << std::endl; std::cout << "row major 4:\n" << col_x4 << std::endl;
结果如下:
row major 1: 1 2 3 4 5 6 col major 2: 1 2 3 4 5 6 col major 3: 1 4 2 5 3 6 row major 4: 1 2 3 4 5 6
说明:
Eigen::Map的基本用法:经常会处理其他数据结构和Eigen的转换,比如把opencv的mat转为eigen的matrix,或者std::vector的填入matrix。在不进行拷贝的情况下可以使用eigen的map功能进行内存映射。不过一定注意映射后的内存不要被原结构释放了。Map相当于原对象的引用,会改变原对象的内容,生存周期也要和原类型保持一致。
作者:水水滴答
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。