关于Eigen库的矩阵分解方法选取与范数

        在非线性优化中,大多数要构建最小二乘方程组,求解需要进行矩阵分解,判断算法收敛性的时候,需要矩阵(向量)的范数,最常用的库之一当然有Eigen。Eigen提供了多种分解方法,以至于在实际选用的时候不知道用哪种方法好(我也是遇到这种尬的问题,要是只提供一种方法,我想都不想,直接***)。

一、Eigen矩阵分解

        Eigen库只有头文件,cmake再使用的时候只需要包含头文件就行了,不需要进行链接。

        Eigen主要提供了以下几种分解方法:Cholesky分解(包括LLT、LDLT),QR分解,SVD分解,LU分解(包括ParttialPivLU、FullPivLU)这四种分解法,对应Eigen库的头文件包括:

#include

#include

#include

#include

        下图表示了对于这几种方法分解,对矩阵的最基本要求:比如ParttialPivLU要求矩阵可逆,LLT要求矩阵正定,LDLT要求矩阵可以半正定;

关于Eigen库的矩阵分解方法选取与范数_第1张图片

        方法的选择主要跟系数矩阵相关

1、如果系数矩阵是对于非对称、可逆的:则最适合的分解求解方法是partialPivLu;

2、如果系数矩阵是对称、正定的(正定方程组):则最适合的分解方法是 llt 或ldlt;

3、求解通用的欠定或超定线性方程组的最小二乘解:svd,可以认为BDC是Jacobi的扩展版本,是兼容它的,对于小矩阵 (<16),最好直接使用JacobiSVD 。对于较大的,强烈建议使用BSDCSVD,它可以快几个数量级;

4、如果矩阵可逆,选用QR分解也比较好,一般使用ColPivHouseholderQR(列旋转,稳定性比较高),速度也介于三个中间;

更具体的可以直接去官网查看:

Eigen: Main Pagehttps://eigen.tuxfamily.org/dox/

二、范数及Eigen的调用

1、向量v = \begin{Bmatrix} x1, & x2,& x3,& ... \end{Bmatrix}的p范数

表示:\left \| v \right \|_{p},注意是右下标

计算:\sqrt[p]{\left | x1 \right |^{p}+\left | x2 \right |^{p}+\left | x3 \right |^{p}+...}

===> 于是有:

0-范数,向量中非零元的个数;
1-范数,向量中各个元素绝对值之和
2-范数,向量中各元素的平方之和再开方;==(向量的模

(正/负)无穷范数,所有向量元素绝对值最大(小)值;

2、矩阵A的范数

Frobenius范数,矩阵中所有元素平方和再开根

0范数,矩阵中非0元素的个数;(矩阵稀疏度);

1范数(列范数),矩阵中每列元素的绝对值之和的最大值;

2范数(谱范数),矩阵的最大奇异值(奇异值大于0的)。也等于A^{T}A最大特征值的平方根;

无穷范数(行范数),矩阵中每行元素的绝对值之和的最大值;

3、Eigen计算:

        对矩阵、向量计算都适用:

关于Eigen库的矩阵分解方法选取与范数_第2张图片

squaredNorm(): 各元素平方之和;等价于向量v^{T}v

norm(): 向量2范数,模长;

模板函数:lpNorm()

lpNorm<1>(): 向量1范数;

lpNorm(): 向量无穷范数;

你可能感兴趣的:(0_1SLAM,矩阵,线性代数,机器人)