无废话!Eigen库的基本使用代码

目录

一、创建矩阵

1、引用EIGEN

2、创建一个矩阵

3、创建3维向量和3维方阵

4、动态矩阵

5、更简洁的创建

二、矩阵初始化

1、设初值全为0

2、设初值为随机数

三、输入和输出矩阵

1、输入

(1)、全部输入

(2)、局部输入

2、输出

四、矩阵运算

1、矩阵乘法

2、加减运算

3、数乘运算

五、矩阵变换

1、转置

2、求和

3、求迹

4、求逆

5、求行列式的值

 6、求特征值和特征向量

 六、矩阵应用

1、解方程


一、创建矩阵

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) 转置后A^{T}(n,m).。

Eigen::Matrix A(m,n);

//打印转置矩阵
cout << A.transpose() << endl;

2、求和

求矩阵各个元素的总和。

cout << A.sum() << endl;

3、求迹

矩阵的迹=矩阵正对角线元素的和

cout << A.trace() << endl;

4、求逆

A*A^{-}=E

cout << A.inverse() << endl;

5、求行列式的值

必须为m行m列才可以

cout << A.determinant() << endl;

 6、求特征值和特征向量

首先,你要知道要方阵(m行m列)才有特征值和特征向量

A\alpha =\lambda \alpha

//首先创建一个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个系数)

a_{11}x_{1}+a_{12}x_{2}+.......+a_{1n}x_{n}=b_{1}

a_{n1}x_{1}+a_{n2}x_{2}+.......+a_{nn}x_{n}=b_{n}

那么解这个方程就可以用矩阵表示Ax=b

其中,A为a_{ij}组成的矩阵;b为b_{i}组成的列向量;x为x_{j}组成的列向量

下面求解x:(当m=n时并且有唯一解)

① 最简单暴力的方法就是Ax=b方程左右两边同时乘上A的逆矩阵A^{-};

这样我们就得到了式子x=A^{-}*b

下面是代码:

//创建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;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值