赞
踩
在非线性优化中,大多数要构建最小二乘方程组,求解需要进行矩阵分解,判断算法收敛性的时候,需要矩阵(向量)的范数,最常用的库之一当然有Eigen。Eigen提供了多种分解方法,以至于在实际选用的时候不知道用哪种方法好(我也是遇到这种尬的问题,要是只提供一种方法,我想都不想,直接***)。
一、Eigen矩阵分解
Eigen库只有头文件,cmake再使用的时候只需要包含头文件就行了,不需要进行链接。
Eigen主要提供了以下几种分解方法:Cholesky分解(包括LLT、LDLT),QR分解,SVD分解,LU分解(包括ParttialPivLU、FullPivLU)这四种分解法,对应Eigen库的头文件包括:
#include <Eigen/Cholesky>
#include <Eigen/QR>
#include <Eigen/SVD>
#include <Eigen/LU>
下图表示了对于这几种方法分解,对矩阵的最基本要求:比如ParttialPivLU要求矩阵可逆,LLT要求矩阵正定,LDLT要求矩阵可以半正定;
方法的选择主要跟系数矩阵相关:
1、如果系数矩阵是对于非对称、可逆的:则最适合的分解求解方法是partialPivLu;
2、如果系数矩阵是对称、正定的(正定方程组):则最适合的分解方法是 llt 或ldlt;
3、求解通用的欠定或超定线性方程组的最小二乘解:svd,可以认为BDC是Jacobi的扩展版本,是兼容它的,对于小矩阵 (<16),最好直接使用JacobiSVD 。对于较大的,强烈建议使用BSDCSVD,它可以快几个数量级;
4、如果矩阵可逆,选用QR分解也比较好,一般使用ColPivHouseholderQR(列旋转,稳定性比较高),速度也介于三个中间;
更具体的可以直接去官网查看:
Eigen: Main Pagehttps://eigen.tuxfamily.org/dox/
二、范数及Eigen的调用
1、向量的p范数
表示:,注意是右下标
计算:
===> 于是有:
0-范数,向量中非零元的个数;
1-范数,向量中各个元素绝对值之和;
2-范数,向量中各元素的平方之和再开方;==(向量的模)
(正/负)无穷范数,所有向量元素绝对值最大(小)值;
2、矩阵A的范数
Frobenius范数,矩阵中所有元素平方和再开根;
0范数,矩阵中非0元素的个数;(矩阵稀疏度);
1范数(列范数),矩阵中每列元素的绝对值之和的最大值;
2范数(谱范数),矩阵的最大奇异值(奇异值大于0的)。也等于最大特征值的平方根;
无穷范数(行范数),矩阵中每行元素的绝对值之和的最大值;
3、Eigen计算:
对矩阵、向量计算都适用:
squaredNorm(): 各元素平方之和;等价于向量;
norm(): 向量2范数,模长;
模板函数:lpNorm<xx>()
lpNorm<1>(): 向量1范数;
lpNorm<EIgen::Infinity>(): 向量无穷范数;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。