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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

eigen库的使用_eigenvalue

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

塊是matrixarray中的矩形子塊。

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

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。