Eigen 库介绍:
一、Eigen 库简介
Eigen 是一个开源的 C++ 模板库,专注于线性代数运算(矩阵、向量、数值求解等)。其特点包括:
-
高性能:通过表达式模板优化(编译时计算),接近手写汇编的速度。
-
纯头文件:无需编译库,直接包含头文件即可使用。
-
丰富的功能:支持矩阵运算、线性求解、特征值分解、稀疏矩阵等。
-
易用 API:语法类似 MATLAB,直观易学。
-
跨平台:支持 Linux/Windows/macOS,兼容 GCC/Clang/MSVC 等编译器。
-
模块化架构
#include <Eigen/Core> // 基础矩阵运算 #include <Eigen/LU> // 矩阵分解 #include <Eigen/SVD> // 奇异值分解 #include <Eigen/Sparse> // 稀疏矩阵
二、安装 Eigen
方法 1:包管理器安装(推荐)
- Ubuntu/Debian:
sudo apt-get install libeigen3-dev
- MacOS (Homebrew):
brew install eigen
方法 2:源码安装
- 下载源码:Eigen 官网
- 解压后,将
Eigen
目录复制到系统头文件路径(如/usr/include/
):cp -r eigen-3.4.0/Eigen /usr/include/
三、基础用法示例
1. 包含头文件
#include <iostream>
#include <Eigen/Dense> // 核心矩阵运算
using namespace Eigen;
2. 声明矩阵和向量
// 3x3 双精度动态矩阵
MatrixXd mat(3, 3);
// 3维双精度向量
Vector3d vec(1.0, 2.0, 3.0);
// 固定大小矩阵(编译时确定)
Matrix3d mat_fixed;
3. 初始化矩阵
// 逗号初始化
mat << 1, 2, 3,
4, 5, 6,
7, 8, 9;
// 随机矩阵
mat = MatrixXd::Random(3, 3);
// 单位矩阵
mat = Matrix3d::Identity();
Matrix4d Z = Matrix4d::Zero();// 零矩阵
// 映射外部内存(零拷贝)
float data[9] = {1,2,3,4,5,6,7,8,9};
Map<Matrix3f> M(data); // 直接操作 data 内存
4. 基本运算
// 矩阵乘法
MatrixXd result = mat * mat_fixed;
// 向量点积
double dot = vec.dot(vec);
// 矩阵求逆(直接法,小矩阵适用)
Matrix3d inv_mat = mat.inverse();
// 解线性方程组 Ax = b
Vector3d x = mat.lu().solve(vec); // LU分解
四、常用操作速查表
操作 | 代码示例 |
---|---|
矩阵加减 | MatrixXd C = A + B; |
标量乘法 | MatrixXd D = 2.5 * A; |
转置 | MatrixXd AT = A.transpose(); |
元素求和 | double sum = A.sum(); |
最大值/最小值 | double max = A.maxCoeff(); |
矩阵块操作 | MatrixXd block = A.block<2,2>(1,1); |
按元素乘法 | MatrixXd E = A.cwiseProduct(B); |
计算特征值 | EigenSolver<MatrixXd> es(A); |
五、高级功能
1. 矩阵分解
// QR 分解
HouseholderQR<MatrixXd> qr(A);
VectorXd x = qr.solve(b);
// SVD 分解
JacobiSVD<MatrixXd> svd(A, ComputeThinU | ComputeThinV);
MatrixXd U = svd.matrixU();
2. 稀疏矩阵
#include <Eigen/Sparse>
SparseMatrix<double> sp_mat(1000, 1000); // 稀疏矩阵
sp_mat.insert(0, 1) = 1.0; // 插入非零元素
3. 几何变换(旋转、平移)
#include <Eigen/Geometry>
AngleAxisd rotation(M_PI/2, Vector3d::UnitZ()); // 绕Z轴旋转90°
Matrix3d rot_matrix = rotation.toRotationMatrix();
六、性能优化建议
- 启用编译器优化:编译时添加
-O3
标志。 - 固定大小矩阵:对小矩阵(≤4x4)使用
Matrix4d
等固定类型。 - 避免自动求值:使用
.noalias()
防止临时变量:C.noalias() = A * B; // 避免创建临时矩阵
- 内存对齐:对固定大小矩阵使用
EIGEN_MAKE_ALIGNED_OPERATOR_NEW
。
七、官方资源
- 文档:https://eigen.tuxfamily.org/dox/
- 快速参考:https://eigen.tuxfamily.org/dox/group__QuickRefPage.html
八、调试技巧
若遇到奇怪的编译错误:
- 检查矩阵维度是否匹配。
- 确保使用
MatrixXd
(动态)或Matrix3d
(固定)正确类型。 - 尝试
EIGEN_INITIALIZE_MATRICES_BY_ZERO
宏初始化零矩阵。