惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

爱范儿
爱范儿
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
WordPress大学
WordPress大学
Y
Y Combinator Blog
I
InfoQ
美团技术团队
罗磊的独立博客
B
Blog RSS Feed
GbyAI
GbyAI
小众软件
小众软件
IT之家
IT之家
Engineering at Meta
Engineering at Meta
Blog — PlanetScale
Blog — PlanetScale
V
V2EX
Last Week in AI
Last Week in AI
酷 壳 – CoolShell
酷 壳 – CoolShell
Jina AI
Jina AI
MyScale Blog
MyScale Blog
博客园 - 聂微东
Microsoft Security Blog
Microsoft Security Blog
博客园 - 【当耐特】
Apple Machine Learning Research
Apple Machine Learning Research
The GitHub Blog
The GitHub Blog
T
The Blog of Author Tim Ferriss

又见苍岚

COLMAP PatchMatch Stereo 算法详解 事件驱动的状态机框架:从理论到工程实践 Git 在国内网络环境下无法 Push 的排查与修复 —— 配置 Clash 代理 分段五次多项式插值原理详解 路径插值方法深度对比研究 Claude Code 使用指南 OpenClaw 记忆管理与技能创建指南 CBS(Conflict-Based Search)算法详解 A* 算法及其变种详解 OpenClaw 配置多 Agents Windows Powershell 无法加载文件,因为在此系统上禁止运行脚本问题的解决方案 MaxClaw 安装流程 大模型 AI 名词介绍 AList 网盘聚合工具简介 Protobuf 简介与测试 Claude Code 简介以及 GLM 4.7 模型接入 Github 歌词下载工具 163MusicLyrics Python __getattr__ 懒加载 Python TypedDict 机器人仿真平台 Gazebo 安装记录 机器人仿真平台 Gazebo 简介 多机器人路径规划问题(Multi-Agent Path Finding, MAPF)简介 Python exifread 读取修改过的 jpeg 信息错误问题修复 3D 坐标系变换的理解 3D 旋转矩阵基本概念 MongoDB Compass 介绍 Python 环境管理工具 uv Flutter 开发指南 Snipaste 安装下载与黑屏问题解决方案 全局路径规划算法记录
C++ 矩阵运算库 Eigen
Yiwei Zhang · 2023-01-12 · via 又见苍岚

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

参考资料

文章链接:
https://www.zywvvd.com/notes/coding/cpp/eigen/eigen/