Eigen 是纯头文件 C ++ 矩阵库,无需编译链接,包含即可使用;支持固定 / 动态大小矩阵向量,推荐逗号初始化器。

在 C ++ 中使用 Eigen 库做矩阵运算,核心是理解其表达式模板机制和零拷贝设计——不用手动管理内存,也不用写循环,写法接近数学公式。
安装与基本配置
Eigen 是纯头文件库,不需要编译安装。下载官方 zip 包或用包管理器(如 vcpkg、conan)引入后,在代码中直接包含即可:
- #include
—— 常用矩阵、向量、线性代数功能全在这里 - #include
—— 大型稀疏矩阵才需要 - 无需链接任何库,编译时加上 -I/path/to/eigen 指向头文件目录
定义矩阵与向量
Eigen 提供多种预设类型,按数据类型(float/double)和大小(固定 / 动态)区分:
- Eigen::Matrix2d A; —— 2×2 双精度矩阵,未初始化
- Eigen::MatrixXd B(3, 4); —— 动态大小的 3 行 4 列矩阵,元素默认未初始化
- Eigen::Vector3f v; —— 固定长度为 3 的单精度向量
- Eigen::RowVectorXf u(5); —— 动态行向量,含 5 个 float 元素
- 初始化推荐用逗号初始化器:A(按列优先填入)
常见线性代数运算
运算符重载让写法自然,且大部分操作是延迟求值(lazy evaluation),真正计算发生在赋值或取值时:
立即学习 “C++ 免费学习笔记(深入)”;
- 加减乘:C = A + B;、D = A * B;(注意是矩阵乘,不是逐元素)
- 转置:A.transpose()(返回表达式,不实际转置;要修改原矩阵用 A.transposeInPlace())
- 共轭转置(复数):A.adjoint()
- 逆矩阵:A.inverse()(小矩阵可用,但数值不稳定,解方程推荐用分解法)
- 行列式:A.determinant()
- 特征值分解:Eigen::SelfAdjointEigenSolver<:matrixxd> eig(A);(仅适用于对称 / 厄米矩阵)
高效求解线性方程组 Ax = b
避免显式求逆,优先用矩阵分解接口,Eigen 会自动选择合适算法:
- 对于一般矩阵:x = A.lu().solve(b);
- 对于对称正定矩阵(如协方差阵):x = A.llt().solve(b);(Cholesky 更快更稳)
- 对于病态或秩亏矩阵:x = A.colPivHouseholderQr().solve(b);(带列主元 QR,鲁棒性强)
- 所有。solve() 返回解向量,内部已优化,比手写高斯消元更可靠
掌握这些就能覆盖大多数科学计算场景。Eigen 的亮点在于表达清晰、性能接近手写循环,同时保持 C ++ 类型安全和现代语法风格。
以上就是