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++ 中線性代數運算的首選庫之一。深入掌握其特性后,可在項目中高效實現復雜的數學運算。