分享

Eigen入门指导书1--矩阵类

 SLAM之路 2022-04-24

矩阵类

Eigen中所有矩阵和向量都是矩阵模板类的对象,向量是矩阵的特列(仅有1行或1列);

01

矩阵类模板

1、矩阵类共有六个模板参数;

2、其中前三个较为重要;

3、后三个一般采用默认值;

关键点

Matrix<typename Scalar,            

       int RowsAtCompileTime,     

       int ColsAtCompileTime,      

       int Options = 0,            

       int MaxRowsAtCompileTime = RowsAtCompileTime,

       int MaxColsAtCompileTime = ColsAtCompileTime

>

路线安排

Scalar

矩阵元素数据类型

重点

RowsAtCompileTime

矩阵行数

重点

ColsAtCompileTime

矩阵列数

重点

Options 

存储顺序

ColMajor默认

RowMajor

可选参数

MaxRowsAtCompileTime

编译阶段矩阵的上限

_

可选参数

MaxColsAtCompileTime

编译阶段矩阵的上限

_

可选参数

注:

固定大小:RowAtCompileTime和ColsAtCompileTime分别表示矩阵的行数和列数;(编译时行列已知);

动态大小:当编译时矩阵维度不清楚时,RowAtCompileTime和ColsAtCompileTime可设置为Eigen::Dynamics-动态大小;

为方便起见,Eigen中定义了许多常用情况的矩阵和向量的简写形式:

typedef Eigen::Matrix<float, 4, 4> Matrix4f;

typedef Matrix<float, 3, 1> Vector3f;

typedef Matrix<int, 1, 2> RowVector2i;

typedef Matrix<double, Dynamic, Dynamic> MatrixXd;

typedef Matrix<int, Dynamic, 1> VectorXi;

Matrix<float, 3, Dynamic>

02

矩阵类构造函数

1、矩阵模板类有默认构造函数;

2、该函数不分配任何内存空间而且不初始化矩阵元素

Eigen::Matrix3f a;  //a是一个纯float数据,且元素未初始化
Eigen::MatrixXf b; //b是一个动态矩阵,其尺寸目前是0×0,它的元素空间尚未分配

代码片段:可切换语言,无法单独设置文字格式

3、构造函数中也可则增加矩阵尺寸数据,构造函数会按照尺寸分配空间,但是未初始化矩阵元素;

MatrixXf a(10, 15); //a是一个10×15的动态矩阵,已分配空间但元素未初始化
VectorXf b(30);    //b是一个30的列向量,已分配空间但元素未初始化

代码片段:可切换语言,无法单独设置文字格式

4、提供可以初始化小型固定尺寸列向量的构造函数(尺寸可达4);

Vector2d a(5.0, 6.0);Vector3d b(5.0, 6.0, 7.0);Vector4d b(5.0, 6.0, 7.0, 8.0);

03

访问矩阵元素

1、Eigen中主要的访问方法是重载括号运算符;

2、对矩阵而言,行序号在列序号前;对于向量,仅有一个序号;排序从0开始:

Eigen::MatrixXd m(2,2);m(0,0) = 3; m(1,0) = 2.5;m(0,1) = -1;m(1,1) = m(1,0) + m(0,1);Eigen::VectorXd v(2);

3、语法m(index)不仅可在向量中使用,也可在矩阵中使用:这意味着矩阵中按照元素顺序方法,具体取决于矩阵内部的存储顺序,默认情况下都采用以列为基础的存储顺序:

Eigen::Matrix<int, 3, 4, ColMajor>;//矩阵模板类第四个参数:ColMajor和RowMajor;

4、运算符[]可重载为向量访问符号,C++中[]只能接纳一个参数,因此只能用于向量访问,不可访问矩阵;

04

逗号初始化

矩阵和向量元素可以方便地使用逗号初始化对元素赋初值:

Eigen::Matrix3f m;m << 1, 2, 3,      4, 5, 6,     7, 8, 9;std::cout << m;

05

矩阵尺寸调整

1、矩阵当前尺寸:rows()、cols()、size()分别返回矩阵的行数、列数、和元素数量;

2、动态矩阵可使用函数resize()调整尺寸

Eigen::MatrixXd m(2,5); m.resize(4,3);std::cout << "The matrix m is of size "           << m.rows() << "x" << m.cols() << std::endl;std::cout << "It has " << m.size() << " coefficients" << std::endl;Eigen::VectorXd v(2);v.resize(5);std::cout << "The vector v is of size " << v.size() << std::endl;std::cout << "As a matrix, v is of size "            << v.rows() << "x" << v.cols() << std::endl

注:conservativeResize(),改变矩阵尺寸不改变元素值,具体参考:

https://eigen./dox/classEigen_1_1PlainObjectBase.html#a712c25be1652e5a64a00f28c8ed11462

06

赋值

1、赋值是赋值一个矩阵到另一个矩阵,即使用符号“=”;

2、Eigen自动调整=左边的矩阵以满足右边矩阵尺寸,针对动态矩阵;

Eigen::MatrixXf a(2,2); std::cout << "a is of size " << a.rows() << "x" << a.cols() << std::endl;Eigen::MatrixXf b(3,3);a = b;  //左侧矩阵必须是动态的std::cout << "a is now of size " << a.rows() << "x" << a.cols() << std::endl;

07

固定大小 vs 动态大小

固定矩阵:用于小型矩阵,尤其是尺寸小于16,更有利于性能,避免动态分配内存和循环

动态矩阵:用于大型矩阵或不得不使用;

注:本文参考自https://eigen./dox/group__TutorialMatrixClass.html

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多