C++ Eigen库的下载配置和使用

本文详细介绍了C++的线性代数库Eigen,包括下载、配置方法,以及在Qt和Visual Studio中的使用步骤。文章重点讲解了矩阵的初始化、赋值、访问,特殊矩阵的创建,矩阵运算如相乘、转置、求逆、SVD分解等,为C++的科学计算提供了实用教程。
摘要由CSDN通过智能技术生成

一、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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ctrl A_ctrl C_ctrl V

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值