• Eigen教程(11)


    整理下Eigen库的教程,参考:http://eigen.tuxfamily.org/dox/index.html

    存储顺序

    对于矩阵和二维数组有两种存储方式,列优先和行优先。

    假设矩阵:

    img

    按行优先存储,内存中形式如下:

    8 2 2 9 9 1 4 4 3 5 4 5

    列优先,内存格式:

    8 9 3 2 1 5 2 4 4 9 4 5

    Matrix<int, 3, 4, ColMajor> Acolmajor;
    Acolmajor << 8, 2, 2, 9,
                 9, 1, 4, 4,
                 3, 5, 4, 5;
    cout << "The matrix A:" << endl;
    cout << Acolmajor << endl << endl; 
    cout << "In memory (column-major):" << endl;
    for (int i = 0; i < Acolmajor.size(); i++)
      cout << *(Acolmajor.data() + i) << "  ";
    cout << endl << endl;
    Matrix<int, 3, 4, RowMajor> Arowmajor = Acolmajor;
    cout << "In memory (row-major):" << endl;
    for (int i = 0; i < Arowmajor.size(); i++)
      cout << *(Arowmajor.data() + i) << "  ";
    cout << endl;
    

    输出

    The matrix A:
    8 2 2 9
    9 1 4 4
    3 5 4 5
    
    In memory (column-major):
    8  9  3  2  1  5  2  4  4  9  4  5  
    
    In memory (row-major):
    8  2  2  9  9  1  4  4  3  5  4  5 
    

    PlainObjectBase::data()函数可以返回矩阵中第一个元素的内存位置。

    存储顺序及选择

    Matrix类模板中可以设定存储的方向,RowMajor表示行优先,ColMajor表示列优先。默认是列优先。

    如何选择存储方式呢?

    1. 如果要和其他库合作开发,为了转化方便,可以选择同样的存储方式。
    2. 应用中涉及大量行遍历操作,应该选择行优先,寻址更快。反之亦然。
    3. 默认是列优先,而且大多库都是按照这个顺序的,默认的不失为较好的。

    总结

    本来想春节前任务比较少,翻译完所有的Eigen系列的。但是我的目的是为了使用google的非线性优化库ceres,介绍了这些基本知识也够用了,如果遇到不清楚的函数可以直接到Eigen的官网查询。

    这个系列很简单,只是入门。有更深理解了再续写。

  • 相关阅读:
    Springboot演示小Demo
    快速构建一个 Springboot
    javase练习题--每天写写
    javase练习题
    WebDriver API——延时操作及元素等待
    WebDriver API——javascript的相关操作
    Jenkins安装部署及tomcat的入门介绍
    WebDriver API——鼠标及键盘操作Actions
    sql查询练习
    睡前反省,絮叨絮叨
  • 原文地址:https://www.cnblogs.com/houkai/p/6349991.html
Copyright © 2020-2023  润新知