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