☰
第 22 章 · Eigen 简介与安装
2026/10/8 6:51:01 网站建设 项目流程

从这一章开始,正式进入 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:下载解压(推荐新手)

  1. 打开 Eigen 官网 https://eigen.tuxfamily.org/ 或 GitLab 仓库 https://gitlab.com/libeigen/eigen
  2. 下载最新的.tar.gz或.zip源码包
  3. 解压到任意目录,比如D:\libs\eigen-5.0.0
  4. 记住这个目录——编译时要把它加入"头文件搜索路径"

方式 B:包管理器(Linux/macOS)

sudoaptinstalllibeigen3-dev# Ubuntu / Debianbrewinstalleigen# macOS

版本说明:本书基于Eigen 5.0(官方CHANGELOG.md标注[5.0.0] - 2025-09-30,开始采用语义化版本)。大部分内容也兼容 Eigen 3.4,但有三处实测差异要注意:

  1. 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直接拦下)。
  2. SVD 的计算选项:Eigen 5.0 要求选项写在模板尖括号里,运行时传参的写法已废弃(第 29 章 29.3.1、第 30 章)。
  3. 转置的别名处理: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.exe

MSVC:

cl /std:c++17 /EHsc /utf-8 /I"你的Eigen目录"hello.cpp

关键点:

  • -I(或/I)后面是 Eigen 解压目录(里面有Eigen文件夹的那个目录)
  • -std=c++17指定 C++17 标准
  • MSVC 必须加/utf-8处理中文

⚠ 两个新手必踩的坑

  1. -I写成你的Eigen目录\Eigen会报Eigen/Dense: No such file or directory——正确路径停在eigen-5.0.0那一层。
  2. 运行后cmd里中文变乱码:先执行chcp 65001再运行 exe(附录 C.4 讲原理和一次性解决办法)。

运行结果:

矩阵 m = 1 2 3 4

22.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 这些名字背后的规律。


练习题

  1. 下载并解压 Eigen,编译运行你的第一个 Eigen 程序。
  2. 把矩阵改成 3×3,用<<填入 1 到 9,打印。
  3. 试试#include <Eigen/Dense>和<Eigen/Geometry>分别能用到什么。
  4. 解释-I参数的作用。
  5. 按附录 C.3 把本章程序编译运行一遍,再按附录 C.5~C.7 搭出一个含两个示例的 CMake 工程。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询