eigen学习总结

参考:https://blog.csdn.net/u012936940/article/details/79706280

  1. Matrix 类:

Matrix<typename Scalar, int RowsAtCompileTime, int ColsAtCompileTime>

其中Scalar是变量类型,如float,int等

RowsAtCompileTIme和ColsAtCompileTIme是矩阵的尺寸,分别是行和列

  1. Eigen常用定义:

Matrix4f  是4x4的folat型矩阵

typedef Matrix<float, 4, 4> Matrix4f;

  1. 向量定义:

向量只是一种特殊的矩阵,多数情况下使用的是列向量,一个3维列向量的定义如下:

typedef Matrix<float, 3, 1> Vector3f;

Eigen同样提供了行向量的方便定义的形式

typedef Matrix<int, 1, 2> RowVector2i;

4、参数Dynamic:

        Eigen并不局限于在编译阶段指定矩阵的尺寸,前面提到的RowsAtCompileTIme和ColsAtCompileTIme参数可以取特殊值Dynamic,这代表编译时不能确定矩阵的尺寸,必须在运行时确定。Eigen中称为动态尺寸,编译时确定尺寸的矩阵称为固定尺寸的矩阵:

typedef Matrix<double, Dynamic, Dynamic> MatrixXd;

typedef Matrix<int, Dynamic, 1> VectorXi;

        5、元素获取:

                 ()操作也可以用于获取matrix矩阵元素。也就是小括号

                 []操作符可以用于向量元素的获取,但是不能用于matrix

 

 

  • 矩阵和向量的运算

参考:https://blog.csdn.net/u012936940/article/details/79782068

  1. 矩阵转置

transpose()函数实现矩阵的转置:

定义A的转置为这样一个n×m阶矩阵B,满足B=a(j,i),即 b (i,j)=a (j,i)(B的第i行第j列元素是A的第j行第i列元素)

https://gss0.bdstatic.com/94o3dSag_xI4khGkpoWK1HF6hhy/baike/s%3D220/sign=8f1a0b197d3e6709ba0042fd0bc69fb8/d833c895d143ad4bf98fb1fe80025aafa40f066e.jpg

  1. 矩阵点积

Dot() 函数

两个向量a = [a1, a2,…, an]和b = [b1, b2,…, bn]的点积定义为:

a·b=a1b1+a2b2+……+anbn

 

  1. 矩阵叉积

Cross() 函数

两个向量的叉乘,叉乘的运算结果是一个向量而不是一个标量。并且两个向量的叉积与这两个向量组成的坐标平面垂直。

对于向量a和向量b:

其中:

叉乘几何意义:

在三维几何中,向量a和向量b的叉乘结果是一个向量,更为熟知的叫法是法向量,该向量垂直于a和b向量构成的平面。

在3D图像学中,叉乘的概念非常有用,可以通过两个向量的叉乘,生成第三个垂直于a,b的法向量,从而构建X、Y、Z坐标系。如下图所示:

 

  1. 基础的算术规约操作

Sum() 求所有元素和

Prod()  求所有元素之积

Mean() 求所有元素平均值

MinCoeff() 最小元素

MaxCoeff() 最大元素

trace()     矩阵的迹是对角线元素的和

 

  • Array类和元素级操作

https://blog.csdn.net/u012936940/article/details/79796641

  1. 数组的乘法运算:

数组乘法执行的是对应的元素相乘,而Matrix相乘则是矩阵的积

 

 

  1. Array的常用操作

Abs()函数  返回的是每一个元素的绝对值

Sqrt() 函数 返回的是每一个元素的根。

Min() 函数,构建一个新的数组,新的数组是原来的两个数组的对应位置的最小值

 

  1. Array 和 Matrix 之间的转换

 

  • 块操作

https://blog.csdn.net/u012936940/article/details/79811080

1、Block()函数求子矩阵

利用block()函数,可以从Matrix中取出一个小矩阵来进行处理,使用的语法为matrix.block(i, j, p, q);

matrix.block<p, q>(i, j)。其中i,j是block左上角元素位于矩阵中的位置,p、q是block的大小

 

        2、行和列是一中特殊的块。Eigen提供了特殊的方法:col()和row()

                                 

  1. 边角相关的操作

topLeftCorner() 操作矩阵左上角的区域

leftCols()      操作左边的列区域

bottomRows()  操作底部的行区域

 

  1. 对于向量的块操作

Head() 向量的头几个

Tail()   向量的尾部几个

Segment() 向量中间第几个开始的n个

 

  1. 待续

 

  • 高级初始化:

https://blog.csdn.net/u012936940/article/details/79830267

  1. 逗号初始化

 

  1. 矩阵初始化置0

Zero() 函数

 

  • 规约、迭代、广播:
  1. 布尔规约

all()返回真,如果矩阵或数组的所有元素为真

any()返回真,如果矩阵或数组至少有一个元素为真

count()返回元素为真的个数

 

  1. 部分规约

Mat.colwise()理解为分别去看矩阵的每一列,然后再作用maxCoeff()函数,即求每一列的最大值。

需要注意的是,colwise返回的是一个行向量(列方向降维),rowwise返回的是一个列向量(行方向降维)。

 

 

  1. 广播:

广播的概念类似于部分规约,不同之处在于广播通过对向量在一个方向上的复制,将向量解释成矩阵。

 

  • 几何模块的实践

转自:https://blog.csdn.net/u012936940/article/details/79856678

Eigen的几何模块用来表达空间的旋转、平移等变换。3维空间中刚体的运动有六个自由度,分别是绕3个轴的旋转运动和沿着3个轴的平移运动。对于旋转可以用3x3的旋转矩阵R表示,旋转矩阵描述了刚体经过矩阵作用后的姿态信息,旋转矩阵是一个正交矩阵;然而旋转矩阵有9个参数,9个参数描述6自由度的旋转,有点冗余了。因此旋转还可以用旋转向量来表示,空间中物体的旋转可以看作是绕这某个轴转过一定的角度完成,因此旋转矩阵是个3维向量,其方向代表转轴的方向,其大小代表旋转的角度。 

   实际中物体不光有旋转,还有平移运动,如果用t表示平移向量,那么R*p+t可以描述刚体p的旋转加平移运动,然而当连续多次运动时整个表达式将会变得非常复杂,比如R1*(R*p+t)+t1描述连续两次的运动,因此为了简化书写形式引入齐次坐标的概念,将坐标扩充到4维,将旋转矩阵和平移向量写入一个4x4的变换矩阵中,简化了连续运动公式的形式,但是结果是16个参数描述一个6自由度的运动,更加冗余了。在旋转向量的后面增加3维代表平移向量,即用6维的旋转向量描述旋转和平移运动,看起来比较紧凑了,但是像欧拉角一样也会遇到万向锁问题,导致奇异性;

 

  • 待续

猜你喜欢

转载自blog.csdn.net/haima1998/article/details/82930051