Eigen库简单使用

1、基础

Eigen中所有向量和矩阵都是Eigen::Matrix,它是一个模板类。它的前三个参数为数据类型、行、列,如声明一个2x3的float矩阵:

Matrix<float,2,3> M_23;
1.1 矩阵

矩阵声明

Eigen::Matrix<type,n,m> M_nm;//如果不记得分类的模板,直接用这个总的模板
Eigen::Matrix3d M_33;//3x3矩阵,元素类型为double
Eigen::Matrix2d M_22;//2x2矩阵

Eigen::MatrixXd M_nm(n,m);//nxm矩阵
Eigen::MatrixXd M;//不确定矩阵大小,可使用动态大小的矩阵

矩阵元素操作

M.setZero();//矩阵元素全部置为0
Eigen::Matrix3d M = Eigen::Matrix3d::Random();//随机数矩阵
1.2 向量
typedef Eigen::Matrix<double,3,1> Vector3d;//向量的底层其实还是矩阵
Eigen::Vector3d v3;
Eigen::Vector2d v2;
Eigen::VectorXd v;
2、矩阵操作
2.1、元素访问

矩阵“<<”操作是先填完一行再到下一行;

矩阵(0),矩阵(1)是先取完一列再到下一列;为了保险起见,如果是矩阵,最好用下标(n,m)来进行相应元素的操作。

向量采用(0),(1)来表示元素。

向量可使用"()“和”[]“进行元素访问;矩阵只能用”()"进行元素访问

2.2 块操作
M.block<i,j>(a,b);//从第a行,第b列开始,提取大小为i行j列的块

M.block(a,b,i,j);//从第a行,第b列开始,提取大小为i行j列的块

2.3
M.inverse();//逆
M.transpose();//转置
M.rows();
M.cols();
M.size();
M.resize();//动态矩阵才可以通过resize来改变大小
3、Eigen进行最小二乘求解

一个超定方程组,例如Ax=b没有解。

超定方程组指方程个数大于未知量个数的方程组,例如,如果给定的三点不在一条直线上, 将无法得到这样一条直线同时经过给定这三个点。 也就是说给定的条件(限制)过于严格, 导致解不存在。只能求一个近似解,方法是最小二乘法。最小二乘的意思是,最小化的误差欧式距离平方。

Ax=b中,x是要求的解。

此处使用的三种求解方法为:

  • SVD分解→通常准确率最高,但是速度最慢
  • QR分解→位于两者之间
  • 正规矩阵(normal equation)→速度最快,但是准确率最低
H.colPivHouseholderQr().solve(b);//QR分解
H.ldlt().solve(b);//cholesky分解
3.1QR分解

Eigen中QR分解类有三个:

  • HouseholderQR(没有枢转,快速但不稳定)
  • ColPivHouseholderQR(列枢转,因此有一些慢但是更准确)最常用
  • FullPivHouseholderQR(完全旋转,最慢,但是最稳定)
3.2 正规矩阵

求解 A x = b Ax=b Ax=b的最小二乘解等于求解正规矩阵 A T A x = A T b A^TAx=A^Tb ATAx=ATb.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值