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相当于原对象的引用,会改变原对象的内容,生存周期也要和原类型保持一致。

posted @ 2023-04-28 16:19  水水滴答  阅读(499)  评论(0编辑  收藏  举报