从这一章开始,正式进入 Eigen。本章讲:Eigen 是什么、为什么用它、怎么装、怎么编译第一个程序。
22.1 Eigen 是什么
Eigen是一个 C++ 的线性代数库,提供矩阵、向量、数值求解等能力。
它是纯头文件库(header-only),也就是说没有 .lib/.dll 文件,只需要#include头文件就能用,不需要额外的链接步骤。
Eigen 的特点:
| 特点 | 说明 |
|---|---|
| 纯头文件 | 不用编译、不用链接,#include即用 |
| 模板实现 | 一套代码支持 double/float/int/复数等任意类型 |
| 高性能 | 表达式模板 + 编译期优化,速度接近手写代码 |
| 功能全 | 矩阵运算、分解、求解、几何、稀疏矩阵…… |
| 成熟稳定 | 从 2008 年至今,被无数项目使用 |
Eigen 广泛用于机器人(ROS)、计算机视觉(OpenCV 底层)、图形学、机器学习、物理仿真、自动驾驶等领域。
22.2 为什么学 Eigen
你可能想问:矩阵运算我自己用循环写不行吗?
- 自己写容易出 bug(边界、性能、数值稳定性)
- Eigen 是经过海量项目验证的,正确、高效、好用
- 一行
A.solve(b)顶你自己写几十行 - 几乎所有 C++ 科学计算项目都在用,是行业标准
学会 Eigen,你就拿到了 C++ 科学计算领域最重要的工具之一。
22.3 获取 Eigen
方式 A:下载解压(推荐新手)
- 打开 Eigen 官网 https://eigen.tuxfamily.org/ 或 GitLab 仓库 https://gitlab.com/libeigen/eigen
- 下载最新的
.tar.gz或.zip源码包 - 解压到任意目录,比如
D:\libs\eigen-5.0.0 - 记住这个目录——编译时要把它加入"头文件搜索路径"
方式 B:包管理器(Linux/macOS)
sudoaptinstalllibeigen3-dev# Ubuntu / Debianbrewinstalleigen# macOS版本说明:本书基于Eigen 5.0(官方
CHANGELOG.md标注[5.0.0] - 2025-09-30,开始采用语义化版本)。大部分内容也兼容 Eigen 3.4,但有三处实测差异要注意:
- C++ 标准:官方原文写This is the last major release to support the C++14 language standard. The master branch and subsequent releases will require support for C++17.本书因此统一按C++17讲(实测 C++11 会被头文件里的
#error直接拦下)。- SVD 的计算选项:Eigen 5.0 要求选项写在模板尖括号里,运行时传参的写法已废弃(第 29 章 29.3.1、第 30 章)。
- 转置的别名处理:Eigen 5.0 会在Debug 构建里断言中止,而 Release 构建不报错、静默算错(第 34 章 34.1 有实测表)。
22.4 第一个 Eigen 程序
解压后,写一个hello.cpp:
#include<iostream>#include<Eigen/Dense>// Eigen 的核心头文件intmain(){Eigen::Matrix2d m;// 2x2 的 double 矩阵m<<1,2,3,4;std::cout<<"矩阵 m =\n"<<m<<std::endl;return0;}编译运行
下面命令里的你的Eigen目录,替换成你上一步解压出来的那层目录(就是里面直接能看到Eigen子文件夹的那一层)。
g++(Windows / Linux / macOS 通用):
g++-std=c++17-I"你的Eigen目录"hello.cpp-ohello.exe ./hello.exe例如 Eigen 解压在D:\libs\eigen-5.0.0,就写(Windows 下正斜杠、反斜杠都能用,g++ 里更常见的是写正斜杠):
g++-std=c++17-I"D:/libs/eigen-5.0.0"hello.cpp-ohello.exeMSVC:
cl /std:c++17 /EHsc /utf-8 /I"你的Eigen目录"hello.cpp关键点:
-I(或/I)后面是 Eigen 解压目录(里面有Eigen文件夹的那个目录)-std=c++17指定 C++17 标准- MSVC 必须加
/utf-8处理中文
⚠ 两个新手必踩的坑
-I写成你的Eigen目录\Eigen会报Eigen/Dense: No such file or directory——正确路径停在eigen-5.0.0那一层。- 运行后
cmd里中文变乱码:先执行chcp 65001再运行 exe(附录 C.4 讲原理和一次性解决办法)。
运行结果:
矩阵 m = 1 2 3 422.5 代码解析
#include <Eigen/Dense>:引入 Eigen 的"稠密矩阵"核心功能(矩阵、向量、Array、各种运算)。这是最常用的头文件。Eigen::Matrix2d m:创建一个 2×2 的 double 矩阵(Eigen::是命名空间)。m << 1, 2, 3, 4;:逗号初始化,按行填值。std::cout << m:打印矩阵(Eigen 重载了<<)。
22.6 常用头文件
| 头文件 | 功能 |
|---|---|
<Eigen/Dense> | 核心:矩阵/向量/Array(最常用) |
<Eigen/Geometry> | 旋转/四元数/变换 |
<Eigen/Eigenvalues> | 特征值 |
<Eigen/SVD> | SVD 分解 |
<Eigen/QR> | QR 分解 |
<Eigen/Sparse> | 稀疏矩阵 |
大多数情况,#include <Eigen/Dense>就够了。
22.7 本书代码怎么编译运行
从下一章开始,书里的代码块分成两种:
- 讲解片段:只展示一两个操作,不带
#include和int main(),不能直接编译。它们是给你看懂用的,不是给你运行的。 - 本章完整示例:开头有
#include、里面有int main(),抄下来就能编译运行。每章末尾附近都会有一个(个别小例子也会写成完整程序)。
所以你在本书的用法是:看懂讲解片段,然后把该章的「本章完整示例」存成一个 .cpp,用本章 22.4 那条命令编译运行。
两种更系统的方式,附录 C 里有完整说明:
- 路线 A:一个例子一个 .cpp,一条
g++命令反复用(读书阶段推荐)。 - 路线 B:建一个工程,用
CMakeLists.txt一次编译全部例子。附录 C 把CMakeLists.txt和公共辅助文件common.hpp的全文都给了出来,不需要任何外部代码。
附录 C 里还有一张「章节 ↔ 完整示例」对照表,以及中文输出乱码、路径写错等常见问题的排错清单。
22.8 小结
- Eigen 是纯头文件的 C++ 线性代数库,
#include即用。 - 下载解压 →
-I指定路径 → 编译。 <Eigen/Dense>是最常用头文件。Eigen::Matrix2d创建矩阵,<<初始化,cout打印。
下一章,深入 Eigen 的类型系统——看懂 MatrixXd、Vector3d 这些名字背后的规律。
练习题
- 下载并解压 Eigen,编译运行你的第一个 Eigen 程序。
- 把矩阵改成 3×3,用
<<填入 1 到 9,打印。 - 试试
#include <Eigen/Dense>和<Eigen/Geometry>分别能用到什么。 - 解释
-I参数的作用。 - 按附录 C.3 把本章程序编译运行一遍,再按附录 C.5~C.7 搭出一个含两个示例的 CMake 工程。