
从这一章开始正式进入 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/macOSsudoaptinstalllibeigen3-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 C14 language standard. The master branch and subsequent releases will require support for C17.本书因此统一按C17讲实测 C11 会被头文件里的#error直接拦下。SVD 的计算选项Eigen 5.0 要求选项写在模板尖括号里运行时传参的写法已废弃第 29 章 29.3.1、第 30 章。转置的别名处理Eigen 5.0 会在Debug 构建里断言中止而 Release 构建不报错、静默算错第 34 章 34.1 有实测表。22.4 第一个 Eigen 程序解压后写一个hello.cpp#includeiostream#includeEigen/Dense// Eigen 的核心头文件intmain(){Eigen::Matrix2d m;// 2x2 的 double 矩阵m1,2,3,4;std::cout矩阵 m \nmstd::endl;return0;}编译运行下面命令里的你的Eigen目录替换成你上一步解压出来的那层目录就是里面直接能看到Eigen子文件夹的那一层。gWindows / Linux / macOS 通用g-stdc17-I你的Eigen目录hello.cpp-ohello.exe ./hello.exe例如 Eigen 解压在D:\libs\eigen-5.0.0就写Windows 下正斜杠、反斜杠都能用g 里更常见的是写正斜杠g-stdc17-ID:/libs/eigen-5.0.0hello.cpp-ohello.exeMSVCcl /std:c17 /EHsc /utf-8 /I你的Eigen目录hello.cpp关键点-I或/I后面是 Eigen 解压目录里面有Eigen文件夹的那个目录-stdc17指定 C17 标准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/SVDSVD 分解Eigen/QRQR 分解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.5C.7 搭出一个含两个示例的 CMake 工程。