前言
本文主要描述在c++中应用Eigen进行矩阵(向量)的表示运算,以及Eigen库的下载和配置。
一. Eigen库介绍、下载及配置
Eigen是C++中可以用来调用并进行矩阵计算的一个库,里面封装了一些类,需要的头文件和功能如下:
有关Eigen的详细介绍可以查看其官网主页:http://eigen.tuxfamily.org/dox/index.html
- 下载
Eigen的下载地址如下:http://eigen.tuxfamily.org/index.php?title=Main_Page#Download
在网页右上方选择选择不同版本及格式的压缩包,我这里选择的最新(2023.4.24)发布版本3.4.0的zip文件,点击直接进行下载。 - 配置
(1)将下载的压缩包进行解压;
----------------在VS中配置------------------
右键 项目属性—》配置属性—》C/C++—》常规—》附加包含目录(对话框右边),在对应条款右侧的编辑框中添加解压的Eigen文件夹完整地址目录即可。(如引用下图)
----------------在QT中配置------------------
在QT creator中新建控制台应用项目,在define bulid system中选择qmake,下一步选择MinGW构建套件。完成项目创建后,在项目下的pro文件中添加:INCLUDEPATH += D:\Program Files\eigen3,如下图:
PS:要在命令窗口中显示结果,需要设置:左侧菜单栏项目–》运行–》勾选在终端运行 即可。
二. 使用
(1)Eigen库的引用–一个栗子
#include <QCoreApplication>
#include <iostream>
#include <Eigen/Dense>
//typedef Eigen::MatrixXd Matrix;
//typedef Eigen::VectorXd Vector;
using namespace Eigen;
using namespace std;
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
// Matrix m(3,3);
MatrixXd m(3,3);
m<<1,2,3,
4,5,6,
7,8,9;
// Vector v(3);
VectorXd v(3);
v<<1,2,3;
Vector3d w(11,22,33);
// cout<<"m*v=\n"<<m*v<<endl;
// cout<<m.block(0,0,2,2)<<endl; //取子块
// cout<<m.block<2,2>(0,0)<<endl; // 与上等价
// cout<<m.row(2)<<endl; //取第2行
// m.row(2)<<11,12,13; //第2行赋值
// cout<<m.row(2)<<endl;
// MatrixXd mm;
// mm=m;
// cout<<mm<<endl;
Eigen::Matrix<int, 3, 4> mat1;
Eigen::Matrix<double, 3, Dynamic> mat2;
Eigen::Matrix2cd mat3;
return a.exec();
}
(2)矩阵的定义
矩阵模板函数中一共包含六个模板参数,前三个是比较常用的,分别表示矩阵元素的类型、行数、列数。在矩阵定义的时候可以使用 Dynamic 来表示行或者列数未知。
template<typename _Scalar, int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols>
class Eigen::Matrix< _Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols >
Eigen::Matrix<int, 3, 4> mat1; // 3x4 的 int 类型的矩阵 mat1
Eigen::Matrix<double, 3, Dynamic> mat2; // 3x? 的 double 类型的矩阵 mat2
Eigen::Matrix<float, Dynamic, 4> mat3; // ?x4 的 float 类型的矩阵 mat3
Eigen::Matrix<long, Dynamic, Dynamic> mat4; // ?x? 的 long 类型的矩阵 mat4
在 Eigen 中 typedef 了很多矩阵的类型,通常命名为 Matrix 前缀加一个长度为 1∼4的字符串 S 的命名——MatrixS。其中 S 可以用来判断该矩阵类型,数字 n 表示 n ∗ n,n 的范围是2∼4,字母 d、f、i、c 表示 double、float、int、complex,另外 X 表示行或者列数未知的矩阵。