在经过前面2篇对 eigen库的基础知识了解之后,下面就可以用eigen库进行一些实际的操作了。
1.计算矩阵行列式的值
在Eigen里你不能混合两种不同类型的矩阵,像这样是错的
v_3d << 3, 2, 1;
Eigen::Matrix<double, 2, 1> result_wrong_type = matrix_23 * v_3d;
你不能用一个整数类型的矩阵和一个浮点数的矩阵直接相乘
应该显式转换
cast 强制类型转换
MatrixXf m1;//整数类型矩阵
MatrixXf m5;//浮点数类型的矩阵
float result1;
m5=m1.cast<float>();//矩阵类型的强制转换
result1=m5.determinant();//求行列式的值
result1=floor(result1+0.5);
result2=int(result1);//转化成整数显示
m_str3.Format(_T("%d"),result2);
determinant()函数只能用于浮点数类型的矩阵,如果矩阵的类型是整数,那么就会报错
2.矩阵的分解
1)三角分解
首先先引入几个概念
a)置换矩阵
当 m≦n时,一个 m×n 的(0,1) 矩阵P为置换矩阵的充要条件是P的每一行恰有一个 1,每一列恰有一个 1。
置换矩阵在数学中的矩阵论里,置换矩阵是一种系数只由0和1组成的方块矩阵。置换矩阵的每一行和每一列都恰好有一个1,其余的系数都是0。在线性代数中,每个n阶的置换矩阵都代表了一个对n个元素(n维空间的基)的置换。当一个矩阵乘上一个置换矩阵时,所得到的是原来矩阵的横行(置换矩阵在左)或纵列(置换矩阵在右)经过置换后得到的矩阵。
以3阶置换矩阵为例,其置换矩阵共有3!=6种
比如
b)置换矩阵的逆是其转置矩阵,
c)eigen官网的实例
This class represents a LU decomposition of any matrix, with complete pivoting: the matrix A is decomposed as A=P(-1) LUQ(-1) where L is unit-lower-triangular, U is upper-triangular, and P and Q are permutation matrices. This is a rank-revealing LU decomposition. The eigenvalues (diagonal coefficients) of U are sorted in such a way that any zeros are at the end.
This decomposition provides the generic approach to solving systems of linear equations, computing the rank, invertibility, inverse, kernel, and determinant.
This LU decomposition is very stable and well tested with large matrices. However there are use cases where the SVD decomposition is inherently more stable and/or flexible. For example, when computing the kernel of a matrix, working with the SVD allows to select the smallest singular values of the matrix, something that the LU decomposition doesn’t see.
The data of the LU decomposition can be directly accessed through the methods matrixLU(), permutationP(), permutationQ().
三角分解的内容是非常丰富的,下面是一些分解方法
i)Doolittle分解
对于非奇异矩阵(任n阶顺序主子式不全为0)的方阵A,都可以进行Doolittle分解,得到A=LU,其中L为单位下三角矩阵,U为上三角矩阵;这里的Doolittle分解实际就是Gauss变换;
(ii)Crout分解
对于非奇异矩阵(任n阶顺序主子式不全为0)的方阵A,都可以进行Crout分解,得到A=LU,其中L为下三角矩阵,U为单位上三角矩阵;
(iii)列主元三角分解
对于非奇异矩阵的方阵A,采用列主元三角分解,得到PA=LU,其中P为一个置换矩阵,L,U与Doolittle分解的规定相同;
(iv)全主元三角分解
对于非奇异矩阵的方阵A,采用全主元三角分解,得到PAQ=LU,其中P,Q为置换矩阵,L,U与Doolittle分解的规定相同;
(v)直接三角分解
对于非奇异矩阵的方阵A,利用直接三角分解推导得到的公式(Doolittle分解公式或者Crout分解公式),可以进行递归操作,以便于计算机编程实现;
(vi)“追赶法”
追赶法是针对带状矩阵(尤其是三对角矩阵)这一大稀疏矩阵的特殊结构,得出的一种保带性分解的公式推导,实质结果也是LU分解;因为大稀疏矩阵在工程领域应用较多,所以这部分内容需要特别掌握。
(vii)Cholesky分解法(平方根法)和改进的平方根法
Cholesky分解法是是针对正定矩阵的分解,其结果是 A=LDLT=LD(1/2)D(1/2)LT=L1L1T。如何得到L1,实际也是给出了递归公式。
改进的平方根法是Cholesky分解的一种改进。为避免公式中开平方,得到的结果是A=LDLT=TLT, 同样给出了求T,L的公式。
非奇异矩阵:若n阶方阵A的行列式不为零,即 |A|≠0,则称A为非奇异矩阵或满秩矩阵,否则称A为奇异矩阵或降秩矩阵。
对比eigen官网列举的例子,其采取的是全主元三角分解。