一、Eigen 介绍
Eigen 是 C++ 的线性代数库,可以用于科学计算和矩阵运算。
Eigen库的几个模块(头文件)如下:
各模块含义为:
(1)Core:有关矩阵和数组的类,有基本的线性代数(包含 三角形 和 自伴乘积 相关),还有相应对数组的操作。
(2)Geometry:几何学相关,有关转换、平移、进位制、2D旋转、3D旋转(四元组和角轴相关)
(3)LU:逻辑单元的类,有关求逆,求行列式,LU分解解算器(FullPivLU,PartialPivLU)
(4)Cholesky:包含LLT和LDLT的乔里斯基因式分解法,Cholesky分解是把一个对称正定的矩阵表示成一个下三角矩阵L和其转置的乘积的分解。
(5)Householder:豪斯霍尔德变换,这个模块供几个线性代数模块使用。
(6)SVD:奇异值分解,最小二乘解算器解决奇异值分解。
(7)QR:QR分解求解,三种方法:HouseholderQR、ColPivHouseholderQR、FullPivHouseholderQR
(8)Eigenvalues:特征值和特征向量分解的方法:EigenSolver、SelfAdjointEigenSolver、ComplexEigenSolver
(9)Sparse:稀疏矩阵相关类,对于稀疏矩阵的存储及相关基本线性代数。
(10)Dense:包含Core、Gelometry、LU、Cholesky、SVD、QR和Eigenvalues模块。
(11)Eigen:包含上述所有的模块。
以上内容转载于:Eigen库矩阵运算使用方法
二、Eigen 的下载
官网下载地址:http://eigen.tuxfamily.org/index.php?title=Main_Page
下载右边栏的 zip 文件并解压。
官网也有相关的指导文档(英文的)。
三、Eigen 的配置
3.1 在 Qt 下配置
第一步:在.pro文件下添加如下代码:
INCLUDEPATH += F:\eigen-3.4.0\eigen-3.4.0
这里的路径就是解压Eigen的路径:
第二步:在cpp文件中添加:
#include <Eigen/Dense>
可以根据个人习惯考虑是否添加:
using namespace Eigen;
这样就可以使用Eigen库进行计算了。
3.2 在 Visual Studio (VS) 下配置
以VS2017为例。
在解决方案资源管理器中右键项目名称,选择“属性”。
在属性页面找到c /c++ “常规”里面的“附加包含目录”,点击选择编辑,将刚刚下载的Eigen库文件添加进来即可。
这样就可以在VS中使用Eigen库了。
四、Eigen 的使用
参考资料:Eigen介绍及简单使用
4.1 矩阵和向量的初始化
Eigen中关于矩阵类的模板函数中,共有六个模板参数,常用的只有前三个。其前三个参数分别表示矩阵元素的类型、行数和列数,如定义一个2行3列的数据类型为double的矩阵:
Matrix<double, 2, 3> A;
程序示例:
#include <iostream>
#include <assert.h>
#include <Eigen/Dense>
using namespace std;
using namespace Eigen; //注意这里使用了Eigen命名空间
int main()
{
Matrix<double, 2, 3> A;
cout<<A<<endl;
return 0;
}
//输出:
3.95253e-323 3.95253e-323 7.77391e-317
2.07493e-317 4.99006e-322 7.90505e-323
Eigen中的矩阵类型一般都是用 MatrixXXX 来表示,可以根据该名字来判断其数据类型,”d”表示double类型,”f”表示float类型,”i”表示整数,”c”表示复数。
比如 Matrix2d 表示一个 2*2 的、每个元素都是double类型的矩阵。
同理 Vector3i 表示一个 3*1的、每个元素都是int类型的列向量。
Eigen::Matrix2f B; //创建一个2*2 的、每个元素都是float类型的矩阵B
Eigen::Vector3i b; //创建一个3*2 的、每个元素都是int类型的列向量b
上面的方法只能创建方阵,那么如何创建任意大小的矩阵呢?这就要用到动态矩阵了,如 MatrixXd、MatrixXf 等。
例如 MatrixXd 表示任意大小的元素类型为double的矩阵。
#include <iostream>
#include <assert.h>
#include <Eigen/Dense>
using namespace std; //注意这里没有使用Eigen命名空间
int main()
{
Eigen::MatrixXd a(2,3); //使用前要初始化
cout<<a<<endl;
return 0;
}
//输出:
3.73516e-317 0 0
3.72376e-317 0 1.41134e-310
下面的代码都不使用Eigen命名空间。
4.2 矩阵元素的赋值
在Eigen中重载了”<<”操作符,通过该操作符即可以一个一个元素的进行赋值,也可以一块一块的赋值。另外也可以使用下标进行赋值。
用 ”<<” 操作符赋值:
int main()
{
Eigen::Matrix<double, 2, 3> A;
A<<1,2,3,4,5,6; //用“<<”操作符进行赋值
cout<<A<<endl;
return 0;
}
//输出:
1 2 3
4 5 6
用下标赋值:
int main()
{
Eigen::Matrix<double, 2, 3> A;
A<<1,2,3,4,5,6;
A(1,2)=10; //第2行第3列
cout<<A<<endl;
return 0;
}
//输出:
1 2 3
4 5 10
4.3 矩阵元素的访问
在矩阵的访问中,行索引总是作为第一个参数,Eigen中矩阵、数组、向量的下标都是从0开始。矩阵元素的访问可以通过”()”操作符完成。例如A(2, 3)既是获取矩阵A的第3行第4列元素。
针对向量还提供”[]”操作符,矩阵则不可如此使用。
4.4 获取矩阵大小
获取矩阵行数:A.rows()
获取矩阵列数:A.cols()
获取矩阵大小:A.size()
代码示例:
int main()
{
Eigen::Matrix<double, 3, 5> A;
cout<<A.rows()<<endl; //矩阵行数
cout<<A.cols()<<endl; //矩阵列数
cout<<A.size()<<endl