日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

eigen库的使用_eigenvalue

發(fā)布時(shí)間:2023/12/19 综合教程 33 生活家
生活随笔 收集整理的這篇文章主要介紹了 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. 塊操作

塊是matrixarray中的矩形子塊。

// 方法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()
  • 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中所有元素為true
    • any()=true: 到少有一個(gè)為true
    • count(): 返回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()
    1. 當(dāng)相同的矩陣或array出現(xiàn)在等式左右時(shí),容易出現(xiàn)混淆
    2. 當(dāng)確定不會(huì)出現(xiàn)混淆時(shí),可以使用noalias()
    3. 混淆出現(xiàn)時(shí),可以使用eval()xxxInPlace()函數(shù)解決

總結(jié)

以上是生活随笔為你收集整理的eigen库的使用_eigenvalue的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。