C++ 矩阵运算库 Eigen

本文最后更新于:2023年1月14日 下午

Eigen是可以用来进行线性代数、矩阵、向量操作等运算的C++库,它里面包含了很多算法。。

简介

  • Eigen 是可以用来进行线性代数、矩阵、向量操作等运算的C++库,它里面包含了很多算法。当前(2023.1)最高 release 版本: 3.4.0

    当前官网开发版本已经到了 3.4.90

    在 gitlab 上下载的代码可以直接 checkout 到这个 commit id

  • Eigen 采用源码的方式提供给用户使用,在使用时只需要包含Eigen的头文件即可进行使用。之所以采用这种方式,是因为Eigen采用模板方式实现,由于模板函数不支持分离编译,所以只能提供源码而不是动态库的方式供用户使用

  • Eigen 的定位是矩阵运算,已经被 OpenCV 官方支持,在 C++ 中二者经常协同工作,就像Python 中的 Numpy 和 OpenCV 库的关系一样

  • 官网链接:https://eigen.tuxfamily.org/index.php?title=Main_Page

  • 仓库链接:https://gitlab.com/libeigen/eigen

获取代码

  • 官方仓库中下载代码

    1
    git clone git@gitlab.com:libeigen/eigen.git
  • 当前的代码是 master 分支,代码一直在更新,但没有发布稳定的版本,建议切换到 3.4.0 的当前最高版本,而且经过我测试 3.4.0 在一些任务上效率也更高

    1
    git checkout 3.4.0
  • 源码准备完毕了,建议将 eigen 本地仓库文件夹加入环境变量

    我将该路径设置为环境变量 : EIGEN_PATH 键下的值

  • 创建 C++ 工程,建议在 Release 下配置环境、运行代码,因为 Debug 模式下运行实在是太慢了

  • EIGEN_PATH 添加到附加包含目录就算配置好环境了

  • 使用时引入头文件

模块和头文件

模块 引入头文件 内容
Core #include<Eigen/Core> 包含Matrix和Array类,基础的线性代数运算和数组操作
Geometry #include<Eigen/Geometry> 包含旋转,平移,缩放,2维和3维的各种变换
LU #include<Eigen/LU> 包含求逆,行列式,LU分解
Cholesky \#include<Eigen/Cholesky> 包含LLT和LDLT Cholesky分解
SVD #include<Eigen/SVD> 包含SVD分解
QR #include<Eigen/QR> 包含QR分解
Sparse #include<Eigen/Sparse> 包含稀疏矩阵的存储和运算
Dense `#include<Eigen/Dense>` 包含了Core/Geometry/LU/Cholesky/SVD/QR/Eigenvalues模块
Eigen #include<Eigen/Eigen> 包含Dense和Sparse。

demo

  • 粘贴如下代码,应该就可以运行了
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <iostream>
#include <Eigen/Core>
#include <ctime>

using namespace Eigen;
using namespace std;

#define MATRIX_SIZE 2000

int main()
{
int n_a_rows = 4000;
int n_a_cols = 3000;
int n_b_rows = n_a_cols;
int n_b_cols = 200;

MatrixXi a(n_a_rows, n_a_cols);

for (int i = 0; i < n_a_rows; ++i)
for (int j = 0; j < n_a_cols; ++j) {
a(i, j) = n_a_cols * i + j;
}

MatrixXi b(n_b_rows, n_b_cols);
for (int i = 0; i < n_b_rows; ++i)
for (int j = 0; j < n_b_cols; ++j) {
b(i, j) = n_b_cols * i + j;
}

MatrixXi d(n_a_rows, n_b_cols);

clock_t begin = clock();

d = a * b;

clock_t end = clock();
double elapsed_secs = double(end - begin) / CLOCKS_PER_SEC;
std::cout << "* Time taken : " << elapsed_secs << std::endl;
}
  • 我的输出:
1
* Time taken : 0.782

参考资料


C++ 矩阵运算库 Eigen
https://www.zywvvd.com/notes/coding/cpp/eigen/eigen/
作者
Yiwei Zhang
发布于
2023年1月12日
许可协议