简单介绍C++中线性代数运算库Eigen
Eigen 是一个高性能的 C++ 模板库,专注于线性代数、矩阵和向量运算,广泛应用于科学计算、机器学习和计算机视觉等领域。以下是对 Eigen 库的详细介绍:
1. 概述
- 核心功能:支持矩阵、向量运算,包括基本算术、矩阵分解(如 LU、QR、SVD)、几何变换(旋转、平移)等。
- 特点:
- 表达式模板:通过延迟计算优化性能,减少临时变量。
- 多数据类型:支持
float
、double
、std::complex
等。 - 存储顺序:默认列优先(类似 Fortran),可选行优先(兼容 C 风格数组)。
- 动态与静态矩阵:
MatrixXd
(动态大小双精度)、Vector3f
(固定大小 3 维单精度)等。 - 零依赖:纯头文件实现,无需额外编译。
- 许可证:MPL2(宽松开源协议,允许商业使用)。
2. 安装与配置
-
安装:从 Eigen 官网 下载后,将头文件目录添加到编译器包含路径。
-
包含头文件:
#include <Eigen/Core> // 核心模块(Matrix、Vector) #include <Eigen/Dense> // 常用模块(包含 Core、LU、QR 等) #include <Eigen/Geometry> // 几何变换
3. 基本用法
3.1 定义矩阵与向量
Eigen::MatrixXd mat(3, 3); // 动态大小双精度矩阵
Eigen::Vector3f vec; // 固定大小3维单精度向量
Eigen::Matrix3f mat_fixed; // 固定大小3x3单精度矩阵
3.2 初始化
mat = Eigen::MatrixXd::Random(3, 3); // 随机初始化
vec << 1, 2, 3; // 逗号初始化
mat_fixed = Eigen::Matrix3f::Identity(); // 单位矩阵
3.3 算术运算
Eigen::MatrixXd a = Eigen::MatrixXd::Random(2, 2);
Eigen::MatrixXd b = Eigen::MatrixXd::Random(2, 2);
Eigen::MatrixXd c = a + b; // 逐元素加法
Eigen::MatrixXd d = a * b; // 矩阵乘法
Eigen::MatrixXd e = a.transpose(); // 转置
3.4 解线性方程组
Eigen::Matrix3f A;
Eigen::Vector3f b, x;
A << 1, 2, 3, 4, 5, 6, 7, 8, 10;
b << 3, 3, 4;
x = A.lu().solve(b); // LU分解求解Ax = b
4. 高级功能
4.1 矩阵分解
// QR分解(最小二乘解)
x = A.householderQr().solve(b);
// SVD分解(奇异值分解)
Eigen::JacobiSVD<Eigen::MatrixXd> svd(A, Eigen::ComputeThinU | Eigen::ComputeThinV);
4.2 几何模块
Eigen::AngleAxisd rotation(M_PI/4, Eigen::Vector3d::UnitZ()); // Z轴旋转45度
Eigen::Vector3d point(1, 0, 0);
point = rotation * point; // 应用旋转变换
4.3 内存映射(Map类)
double data[] = {1, 2, 3, 4};
Eigen::Map<Eigen::VectorXd> vec_map(data, 4); // 将数组映射为向量
5. 性能优化
- 表达式模板:自动合并操作(如
a = b + c + d
合并为单层循环)。 - 固定大小矩阵:小型矩阵(如 4x4)在栈上分配,避免堆开销。
- SIMD 优化:启用编译器选项(如
-march=native
)利用 SSE/AVX 指令集。
6. 注意事项
-
别名问题:避免操作中同时读写同一矩阵:
// 错误写法:a = a.transpose(); a = a.transpose().eval(); // 正确写法1 a.transposeInPlace(); // 正确写法2
-
auto 陷阱:延迟计算可能导致意外结果:
auto tmp = a * b; // tmp是表达式对象,非实际矩阵 Eigen::MatrixXd tmp_eval = a * b; // 立即求值
-
内存对齐:固定大小矩阵需注意内存对齐(使用
EIGEN_MAKE_ALIGNED_OPERATOR_NEW
)。
7. 应用场景
- 科学计算:解微分方程、优化问题。
- 计算机视觉:三维重建、相机标定(如 OpenCV 可集成 Eigen)。
- 机器学习:线性回归、PCA 降维。
- 物理引擎:刚体变换、碰撞检测。
8. 对比其他库
库名 | 特点 |
---|---|
Armadillo | 语法类似 Matlab,依赖 LAPACK。 |
OpenCV | 侧重图像处理,内置矩阵但功能较局限。 |
BLAS/LAPACK | 底层标准,需手动管理内存。 |
Eigen 凭借其高性能、易用性和灵活性,成为 C++ 中线性代数运算的首选库之一。深入掌握其特性后,可在项目中高效实现复杂的数学运算。