Eigen库介绍以及模块划分和相关示例代码
Eigen 是一个 C++ 的 高性能线性代数库,广泛用于计算机视觉、机器人、SLAM、机器学习等领域。它提供了矩阵和向量的计算、线性方程求解、特征值分解、SVD、QR、LU 等各种数值计算功能,语法类似 Matlab 且支持表达式模板优化。
一、Eigen 基本介绍
- 官网:https://eigen.tuxfamily.org
- 头文件库:完全基于模板,无需编译,使用时只需
#include <Eigen/Dense>
。 - 跨平台:纯 C++ 实现,兼容 Windows、Linux、macOS。
- 性能优化:通过表达式模板(expression templates)进行懒惰求值,极大地减少中间变量生成。
- 支持多线程/并行:可选支持 OpenMP/Threading Building Blocks。
二、模块划分(头文件)
Eigen 按功能模块划分,每个模块是一个头文件:
模块 | 头文件 | 功能简介 |
---|---|---|
Core | #include <Eigen/Core> | 基础模块,向量、矩阵定义和操作 |
Dense | #include <Eigen/Dense> | 包含 Core + 大部分常用模块 |
Geometry | #include <Eigen/Geometry> | 坐标变换、旋转(Quaternion、AngleAxis) |
LU | #include <Eigen/LU> | LU 分解 |
Cholesky | #include <Eigen/Cholesky> | 适用于正定矩阵的分解(如 LLT) |
QR | #include <Eigen/QR> | QR 分解 |
SVD | #include <Eigen/SVD> | 奇异值分解 |
Eigenvalues | #include <Eigen/Eigenvalues> | 特征值/特征向量分解 |
Sparse | #include <Eigen/Sparse> | 稀疏矩阵支持 |
IterativeSolvers | #include <Eigen/IterativeLinearSolvers> | 稀疏迭代求解器 |
三、示例代码
1. 基本矩阵定义与操作
#include <Eigen/Dense>
#include <iostream>
using namespace Eigen;int main() {Matrix3f A; // 3x3 浮点矩阵A << 1, 2, 3,4, 5, 6,7, 8, 9;Vector3f b(1, 0, 1);Vector3f x = A * b; // 矩阵向量乘法std::cout << "Result:\n" << x << std::endl;return 0;
}
2. 求解线性方程组 A x = b Ax = b Ax=b
#include <Eigen/Dense>
#include <iostream>
using namespace Eigen;int main() {Matrix3d A;A << 3, -1, 2,2, 0, 1,1, 1, -1;Vector3d b(10, 8, 3);Vector3d x = A.colPivHouseholderQr().solve(b);std::cout << "Solution x:\n" << x << std::endl;return 0;
}
3. 使用四元数做旋转(几何模块)
#include <Eigen/Geometry>
#include <iostream>
using namespace Eigen;int main() {Quaternionf q(AngleAxisf(M_PI / 4, Vector3f::UnitZ())); // 绕Z轴旋转45°Vector3f v(1, 0, 0); // 初始向量Vector3f v_rotated = q * v;std::cout << "Rotated vector: " << v_rotated.transpose() << std::endl;return 0;
}
4. 稀疏矩阵(Sparse)
#include <Eigen/Sparse>
#include <iostream>
using namespace Eigen;int main() {SparseMatrix<double> mat(3, 3);mat.insert(0, 0) = 1.0;mat.insert(1, 2) = 2.5;std::cout << "Sparse matrix:\n" << mat << std::endl;return 0;
}
5. 特征值分解
#include <Eigen/Eigenvalues>
#include <iostream>
using namespace Eigen;int main() {Matrix2d A;A << 1, 2,2, 1;EigenSolver<Matrix2d> solver(A);std::cout << "Eigenvalues:\n" << solver.eigenvalues() << std::endl;return 0;
}
四、使用建议与注意事项
建议或注意事项 | 说明 |
---|---|
使用 .transpose() 、.inverse() 等不要重复计算 | 保存结果变量再复用提高效率 |
避免临时矩阵构造 | 表达式模板可以避免中间结果,但链式调用也要注意开销 |
支持 .block() 、.col() , .row() 等块访问 | 适用于子矩阵操作 |
.eval() 强制求值 | 对懒求值表达式需要时强制计算 |
可结合 AutoDiff , Ceres , GTSAM 等使用 | Eigen 是这些库的基础数学模块 |
若数据量大,可启用 Eigen::setNbThreads(n) | 启用多线程计算 |