1.?Map
?類:內存映射(零拷貝操作)
核心功能
將現有的 C/C++ 數組或緩沖區映射為 Eigen 矩陣/向量,不復制數據,直接操作原內存。
模板參數
cpp
Map<Matrix<Scalar, Rows, Cols, Options, MaxRows, MaxCols>>
-
參數與?
Matrix
?一致,通常簡化為?Map<MatrixXd>
(動態大小)或?Map<Vector3f>
(固定大小)。
構造函數與方法
方法/構造函數 | 參數說明 | 功能 | 示例 |
---|---|---|---|
Map(Scalar* data) | data : 原始數組指針 | 映射為一維向量 | float arr[3]; Map<Vector3f> v(arr); |
Map(Scalar* data, Index rows, Index cols) | data : 數組指針,rows/cols : 矩陣尺寸 | 映射為矩陣 | double buf[4]; Map<Matrix2d> m(buf, 2, 2); |
data() | 無 | 返回原始指針 | float* ptr = v.data(); |
注意事項
-
內存對齊:若原始數據未對齊(如動態分配的數組),需使用?
Eigen::Unaligned
?標志:cpp
Map<Matrix3f, Unaligned> m(ptr);
2.?Block
?類:子矩陣操作
核心功能
提取矩陣的某一塊區域(子矩陣),返回一個視圖(不復制數據)。
主要方法
方法 | 參數說明 | 返回值/功能 | 示例 |
---|---|---|---|
block(Index startRow, Index startCol, Index blockRows, Index blockCols) | startRow/startCol : 起始位置,blockRows/blockCols : 子塊大小 | 動態大小子塊 | MatrixXd B = A.block(1, 1, 2, 2); |
block<BlockRows, BlockCols>(startRow, startCol) | 模板參數:子塊固定大小,startRow/startCol : 起始位置 | 固定大小子塊(編譯時優化) | auto C = A.block<2,2>(0, 0); |
topLeftCorner(rows, cols) | 提取左上角子塊 | 同?block | Matrix3f D = A.topLeftCorner(3, 3); |
middleRows(startRow, numRows) | 提取中間連續多行 | 行子矩陣 | VectorXd seg = v.middleRows(2, 3); |
變體方法
-
列/行操作:
col(j).segment(start, length)
(列向量的子段)、row(i).head(n)
(行的前 n 元素)。
3. 視圖類(Transpose
,?Diagonal
?等)
核心功能
通過視圖(View)操作原矩陣的特定結構(如轉置、對角元素),不復制數據。
常用視圖類
類/方法 | 參數說明 | 功能 | 示例 |
---|---|---|---|
transpose() | 無 | 返回轉置視圖 | MatrixXd AT = A.transpose(); (注意:賦值會觸發復制) |
adjoint() | 無 | 返回共軛轉置視圖 | MatrixXcf AH = A.adjoint(); |
diagonal() | 可指定偏移量(默認 0) | 返回對角線的向量視圖 | VectorXd diag = A.diagonal(); |
diagonal<Offset>() | Offset : 對角線的偏移(正數=上對角線,負數=下對角線) | 返回指定對角線的視圖 | VectorXd sup_diag = A.diagonal<1>(); |
triangularView<Mode>() | Mode :?Upper ,?Lower ,?StrictlyUpper ?等 | 返回三角矩陣視圖 | auto L = A.triangularView<Lower>(); |
視圖的賦值與計算
-
視圖可直接參與運算,但若需保存結果,需賦值給具體矩陣:
cpp
MatrixXd B = A.transpose() * A; // 合法:觸發實際計算 auto C = A.transpose(); // C 仍是視圖,依賴 A 的生命周期!
4. 代碼示例
cpp
#include <Eigen/Dense>
using namespace Eigen;// Map 示例
float data[] = {1, 2, 3, 4};
Map<Matrix<float, 2, 2, RowMajor>> mat_map(data); // 按行映射
mat_map(1, 1) = 5; // 修改原數組 data[3] = 5// Block 示例
MatrixXd A(4, 4);
A.setRandom();
MatrixXd B = A.block(1, 1, 2, 2); // 提取 2x2 子矩陣
A.topLeftCorner(2, 2).setZero(); // 將左上角置零// 視圖示例
Vector3d v(1, 2, 3);
MatrixXd M = v * v.transpose(); // 外積(v.transpose() 是視圖)
double d = v.dot(v); // 點積
5. 關鍵注意事項
-
生命周期管理:視圖類(如?
Block
、Transpose
)依賴原矩陣的數據,原矩陣銷毀后視圖無效。 -
性能優化:固定尺寸的?
Block
(如?block<2,2>()
)比動態尺寸更快。 -
別名問題:操作視圖時避免與原矩陣混用,可能導致錯誤:
cpp
A = A.transpose(); // 錯誤!需使用 A.transposeInPlace();
完整方法速查表
操作類型 | 類/方法 | 典型用途 |
---|---|---|
內存映射 | Map<MatrixXd> | 包裝現有數組為 Eigen 矩陣 |
子塊提取 | block() ,?segment() | 操作局部數據 |
結構視圖 | diagonal() ,?transpose() | 快速訪問對角線、轉置等結構 |