eigen库的使用_eigenvalue
生活随笔
收集整理的這篇文章主要介紹了
eigen库的使用_eigenvalue
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Eigen庫使用指南
1.模塊和頭文件
Core#include<Eigen/Core>,包含Matrix和Array類,基礎的線性代數運算和數組操作。Geometry#include<Eigen/Geometry>,包含旋轉,平移,縮放,2維和3維的各種變換。LU#include<Eigen/LU>,包含求逆,行列式,LU分解。Cholesky#include<Eigen/Cholesky>,包含LLT和LDLT Cholesky分解。SVD`#include<Eigen/SVD>,包含SVD分解。QR`#include<Eigen/QR>,包含QR分解。Eigenvalues#include<Eigen/Eigenvalues>,包含特征值,特征向量分解。Sparse#include<Eigen/Sparse>,包含稀疏矩陣的存儲和運算。Dense#include<Eigen/Dense>,包含了Core/Geometry/LU/Cholesky/SVD/QR/Eigenvalues模塊。Eigen#include<Eigen/Eigen>,包含Dense和Sparse。
2. Matrix類
- 所有矩陣和向量都是
Matrix模板類的對象,Matrix類有6個模板參數,主要使用前三個,剩下的使用默認值。
Matrix<typename Scalar,
int RowsAtCompileTime,
int ColsAtCompileTime,
int Options = 0,
int MaxRowsAtCompileTime = RowsAtCompileTime,
int MaxColsAtCompileTime = ColsAtCompileTime>
# Scalar 元素類型
# RowsAtCompileTime 行
# ColsAtCompileTime 列
# 例 typedef Matrix<int, 3, 3> Matrix3i;
# Options 比特標志位
# MaxRowsAtCompileTime和MaxColsAtCompileTime表示在編譯階段矩陣的上限。
# 列向量
typedef Matrix<double, 3, 1> Vector3d;
# 行向量
typedef Matrix<float, 1, 3> RowVector3f;
# 動態大小
typedef Matrix<double, Dynamic, Dynamic> MatrixXd;
typedef Matrix<float, Dynamic, 1> VectorXf;
type
- 默認構造時,指定大小的矩陣,只分配相應大小的空間,不進行初始化。動態大小的矩陣,則未分配空間。
[]操作符可以用于向量元素的獲取,但不能用于matrix。matrix的大小可以通過rows(),cols(),size()獲取,resize()可以重新調整矩陣大小。
3. 矩陣與向量的運算
- Eigen不支持類型自動轉化,因此矩陣元素類型必須相同。
- 支持
+, -, +=, -=, *, /, *=, /=基礎四則運算。 - 轉置和共軛
MatrixXcf a = MatrixXcf::Random(3,3);
a.transpose(); # 轉置
a.conjugate(); # 共軛
a.adjoint(); # 共軛轉置(伴隨矩陣)
# 對于實數矩陣,conjugate不執行任何操作,adjoint等價于transpose
a.transposeInPlace() #原地轉置
Vector3d v(1,2,3);
Vector3d w(4,5,6);
v.dot(w); # 點積
v.cross(w); # 叉積
Matrix2d a;
a << 1, 2, 3, 4;
a.sum(); # 所有元素求和
a.prod(); # 所有元素乘積
a.mean(); # 所有元素求平均
a.minCoeff(); # 所有元素中最小元素
a.maxCoeff(); # 所有元素中最大元素
a.trace(); # 跡,對角元素的和
# minCoeff和maxCoeff還可以返回結果元素的位置信息
int i, j;
a.minCoeff(&i, &j);
4. Array類
Array是個類模板,前三個參數必須指定,后三個參數可選。
Array<typename Scalar,
int RowsAtCompileTime,
int ColsAtCompileTime>
# 常見類定義
typedef Array<float, Dynamic, 1> ArrayXf
typedef Array<float, 3, 1> Array3f
typedef Array<double, Dynamic, Dynamic> ArrayXXd
typedef Array<double, 3, 3> Array33d
ArrayXf a = ArrayXf::Random(5);
a.abs(); # 絕對值
a.sqrt(); # 平方根
a.min(a.abs().sqrt()); # 兩個array相應元素的最小值
- 當執行array*array時,執行的是相應元素的乘積,所以兩個array必須具有相同的尺寸。
Matrix對象——>Array對象:.array()函數Array對象——>Matrix對象:.matrix()函數
4. 塊操作
塊是matrix或array中的矩形子塊。
// 方法1
.block(i, j, p, q) //起點(i, j),塊大小(p, q),構建一個動態尺寸的block
.block<p, q>(i, j) // 構建一個固定尺寸的block
matrix.row(i): 矩陣第i行matrix.col(j): 矩陣第j列- 角相關操作
| operater | dynamic-size block | fixed_size block |
|---|---|---|
| 左上角 | matrix.topLeftCorner(p,q) | matrix.topLeftCorner<p,q>() |
| 左下角 | matrix.bottomLeftCorner(p,q) | matrix.bottomLeftCorner<p,q>() |
| 右上角 | matrix.topRightCorner(p,q) | matrix.topRightCorner<p,q>() |
| 右下角 | 你猜 | 你猜 |
| 前q行 | matrix.topRows(q) | matrix.topRows<q>() |
| 后q行 | matrix.bottomRows(q) | matrix.bottomRows<q>() |
| 左p列 | matrix.leftCols(p) | matrix.leftCols<p>() |
| 右p列 | matrix.rightCols(p) | matrix.rightCols<p>() |
Vector的塊操作
| operater | dynamic_size block | fixed_size block |
|---|---|---|
| 前n個 | vector.head(n) | vector.head<n>() |
| 后n個 | vector.tail(n) | vector.tail<n>() |
| 從i開始的n個元素 | vector.segment(i,n) | vector.segment<n>(i) |
5. 矩陣初始化
- 逗號初始化:為矩陣元素賦值,順序是從左到右,從上到下,數目必須匹配。
// 初始化列表除數字外也可以是vectors或matrix
RowVectorXd vec1(3);
vec1 << 1,2,3;
RowVectorXd vec2(2);
vec2 << 4,5;
RowVectorXd vec3(5);
vec3 << vec1, vec2;
// 也可以使用block結構初始化
- 特殊矩陣
- 零陣:類靜態成員函數
Zero() - 常量矩陣:
Constant(rows, cols, value) - 隨機矩陣:
Random() - 單位矩陣:
Identity()
- 零陣:類靜態成員函數
LinSpaced(size, low, high):構建從low到high等間距的size長度的序列,適用于vector和一維數組。- 功能函數
- `setZero()
setIdentity()
6. 歸約,迭代器,廣播
- 范數計算
squareNorm():L2范數,等價于計算vector自身點積norm():返回`squareNorm的開方根.lpNorm<p>():p范數,p可以取Infinity,表無窮范數
- 布爾歸約
all()=true: matrix或array中所有元素為trueany()=true: 到少有一個為truecount(): 返回true元素個數
// sample
ArrayXXf A(2, 2);
A << 1,2,3,4;
(A > 0).all();
(A > 0).any();
(A > 0).count();
- 迭代器,獲取某元素位置
// sample
Eigen::MatrixXf m(2,2);
m << 1,2,3,4;
MatrixXf::Index maxRow, maxCol;
float max = m.maxCoeff(&minRow, &minCol);
- 部分歸約,
// sample
Eigen::MatrixXf mat(2,3);
mat << 1,2,3,
4,5,6;
std::cout << mat.colwise().maxCoeff();
// output: 4, 5, 6
// mat.rowWise() the same as before
- 廣播,針對vector,沿行或列重復構建一個matrix。
// sample
Eigen::MatrixXf mat(2,3);
Eigen::VectorXf v(2);
mat << 1,2,3,4,5,6;
v << 0,1;
mat.colwise() += v;
// output: 1, 2, 3, 5, 6, 7
7. Map類
- Map類用于利用數據的內在,并將其轉為Eigen類型。
- 定義:
Map<Matrix<typename Scalar, int RowAtCompileTime, int ColsAtCompileTime> > - 通過Map來reshape矩陣的形狀。
8. 混淆問題
- 使用
eval()函數解決把右值賦值為一個臨時矩陣,再賦給左值時可能有造成的混淆。如:
MatrixXi mat(3,3);
mat << 1,2,3, 4,5,6, 7,8,9;
mat.bottomRightCorner(2,2) = mat.topLeftCorner(2,2).eval();
- 原地操作的一類函數:
| 普通函數 | inplace函數 |
|---|---|
| MatrixBase::adjoint() | MatrixBase::adjointInPlace() |
| DenseBase::reverse() | DenseBase::reverseInPlace() |
| LDLT::solve() | LDLT::solveInPlace() |
| LLT::solve() | LLT::solveInPlace() |
| TriangularView::solve() | TriangularView::solveInPlace() |
| DenseBase::transpose() | DenseBase::transposeInPlace() |
-
- 當相同的矩陣或array出現在等式左右時,容易出現混淆
- 當確定不會出現混淆時,可以使用
noalias() - 混淆出現時,可以使用
eval()和xxxInPlace()函數解決
總結
以上是生活随笔為你收集整理的eigen库的使用_eigenvalue的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: why we need getCoreC
- 下一篇: 报关单上常出现的英文单词缩写是_报关单用