目录
一、创建矩阵
1、引用EIGEN
//Eigen部分
#include<Eigen/Core>
//稠密矩阵运算
#include<Eigen/Dense>
2、创建一个矩阵
Eigen::Matrix<数据类型,行,列>矩阵名;
//创建一个数据类型为float,2行3列的矩阵,名为mt23
Eigen::Matrix<float,2,3> mt23;
3、创建3维向量和3维方阵
//规则 3维向量
Eigen::Vector3d 向量名;
//创建名为V3d的向量
Eigen::Vector3d V3d;
//规则 3维方阵
Eigen::Matrix3d 方阵名;
//创建名为M3d的方阵
Eigen::Matrix3d M3d;
都是typedef的Matrix,如Vector3d==typedef Matrix<double,3,1>
默认数据类型为double
4、动态矩阵
当不知道该用多大的矩阵时,不妨用动态矩阵(随着插入数据变多自动变大)
Eigen::Matrix<double,Eigen::Dynamic,Eigen::Dynamic> 动态矩阵名;
//创建名为DY_MT的动态矩阵
Eigen::Matrix<double,Eigen::Dynamic,Eigen::Dynamic> DY_MT;
5、更简洁的创建
Eigen::MatrixXd 矩阵名(行,列);
//创建一个名为M22的2行2列的矩阵
Eigen::MatrixXd M22(2,2);
二、矩阵初始化
1、设初值全为0
Eigen::Matrix3d A;
A=Eigen::Matrix3d::Zero();
注意:不同类型对应不同的变量空间。
2、设初值为随机数
Eigen::Matrix3d A;
A=Eigen::Matrix3d::Random();
三、输入和输出矩阵
1、输入
(1)、全部输入
矩阵名 << v1,v2,v3....
//将1,2,3,4输入到一个2行2列的矩阵m中
m << 1,2,3,4;
//将1,2,3插入到v3向量中
v3 << 1,2,3
此时一行一行的填充
输出:
1 2
3 4
(2)、局部输入
直接利用索引进行更改
注意:索引是从0开始的
//将1,2,3,4一个一个插入到M中
M(0,0)=1;
M(0,1)=2;
M(1,0)=3;
M(1,1)=4;
//将1,2,3一个一个插入到v3中
v3(0)=1;
v3(1)=2;
v3(2)=3;
2、输出
cout << 矩阵名 << endl;
四、矩阵运算
1、矩阵乘法
现在有一个矩阵A(m,n),m行n列;还有一个矩阵B(n,k),n行k列。那么A*B=C(m,k),C为m行k列的矩阵。
//创建A(m,n)和B(n,k)
Eigen::MatrixXd A(m,n);
Eigen::MatrixXd B(n,k);
//创建并计算C(m,k)
Eigen::MatrixXd v(m,k) = A*B;
注意:①必须同数据类型才可以直接A*B,当A B数据类型不同时应用cast转化为同一种类型
例:该方法为显示转换
Eigen::Matrix<float,2,3> m23;
Eigen::Matrix<double,3,2> n32;
//需要将m23转化成double类型才可以相乘
Eigen::Matrix<double,2,2> result;
result=m23.cast<double>()*n32;
②C必须为m行k列,否则存不下或者存不对
2、加减运算
同行列矩阵名直接加减。
//创建同类型A和B
Eigen::MatrixXd A(m,n);
Eigen::MatrixXd B(m,n);
//赋值
A << 1,2,3···m*n;
B << 1,2,3···m*n;
//加法
cout << A+B << endl;
//减法
cout << A-B << endl;
3、数乘运算
直接实数m*矩阵名A
//创建矩阵
Eigen::MatrixXd A(m,n);
Eigen::MatrixXd B(m,n);
//赋值
A << 1,2,3···m*n;
B << 1,2,3···m*n;
//数乘运算 k为某一个实数
B=k*A;
五、矩阵变换
1、转置
A(m,n) 转置后(n,m).。
Eigen::Matrix A(m,n);
//打印转置矩阵
cout << A.transpose() << endl;
2、求和
求矩阵各个元素的总和。
cout << A.sum() << endl;
3、求迹
矩阵的迹=矩阵正对角线元素的和
cout << A.trace() << endl;
4、求逆
;
cout << A.inverse() << endl;
5、求行列式的值
必须为m行m列才可以
cout << A.determinant() << endl;
6、求特征值和特征向量
首先,你要知道要方阵(m行m列)才有特征值和特征向量
//首先创建一个3维方阵(3,3)
Eigen::Matrix3d A;
//给A赋值
A << 1,0,0,0,2,0,0,0,3;
//利用SelfAdjointEigenSolver创建一个解决器 在此解决器中自动算出特征向量和特征值
Eigen::SelfAdjointEigenSolver<Eigen::矩阵类型> 解决器名 (需要求特征值的向量名);
Eigen::SelfAdjointEigenSolver<Eigen::Matrix3d> eigen_solver (A);
//调用解决器的方法 打印特征值和特征向量
cout << eigen_solver.eigenvalues() << endl;
cout << eigen_solver.eigenvectors() <<endl;
输出结果如下:
//特征值
1
2
3
//特征向量
1 0 0
0 1 0
0 0 1
六、矩阵应用
1、解方程
现在有一个方程组,(m个方程,n个未知数,m*n个系数)
:
:
那么解这个方程就可以用矩阵表示Ax=b
其中,A为组成的矩阵;b为组成的列向量;x为组成的列向量
下面求解x:(当m=n时并且有唯一解)
① 最简单暴力的方法就是Ax=b方程左右两边同时乘上A的逆矩阵;
这样我们就得到了式子
下面是代码:
//创建A,b向量并赋值
Eigen::Matrix<double,n,n> A;
A << ···;
Eigen::Matrix<double,n,1> b;
b << ···;
//创建x向量
Eigen::Matrix<double,n,1> x;
//暴力计算
x=A.inverse()*b;
注:该方法很慢!效率底下!不推荐!
②矩阵分解,我们用QR分解(函数colPivHouseholderQr),速度会快很多
你只需记住代码,并且知道这种快!
//创建A,b并赋值
Eigen::Matrix<double,n,n> A;
A << ···;
Eigen::Matrix<double,n,1> b;
b << ···;
//创建x并计算
Eigen::Matrix<double,n,1> x;
//你需要记住的代码
x=A.colPivHouseholderQr().solve(b);
//打印
cout << x << endl;