美文网首页
2019-02-26 Eigen库使用

2019-02-26 Eigen库使用

作者: 韦德爱老詹 | 来源:发表于2019-02-26 17:11 被阅读0次

项目里用了很多Eigen做矩阵运算,决定好好整理一下。

1.矩阵定义

Matrix<double, 3, 3> A;               // Fixed rows and cols. Same as Matrix3d.
Matrix<double, 3, Dynamic> B;         // Fixed rows, dynamic cols.
Matrix<double, Dynamic, Dynamic> C;   // Full dynamic. Same as MatrixXd.
Matrix3f P, Q, R;                     // 3x3 float matrix.
Vector3f x, y, z;                     // 3x1 float matrix.
RowVector3f a, b, c;                  // 1x3 float matrix.
VectorXd v;                           // Dynamic column vector of doubles
x.size()          // length(x)        // vector size
C.rows()          // size(C,1)        // number of rows
C.cols()          // size(C,2)        // number of columns
x(i)              // x(i+1)           // Matlab is 1-based
C(i,j)            // C(i+1,j+1)       //访问从(0,0)开始

2.矩阵初始化和基本计算

MatrixXf::Zero(3,4); // 将矩阵3行4列初始化为0
MatrixXf::Ones(3,3); // 将矩阵3行3列初始化为1
Vector3f::Ones(); // 将3行的纵向量初始化为1
MatrixXi::Identity(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);

3.矩阵的分块

P.rowwise.sum()     //行和(维数为1×列数)
P.colwise.sum()     //列和(维数为行数×1)
R.any()                   // any(R(:))   //遍历
R.colwise().any()         // any(R)   //列
R.rowwise().any()         // any(R, 2)  //行

// Eigen                           // Matlab
x.head(n)                          // x(1:n)
x.head<n>()                        // x(1:n)
x.tail(n)                          // x(end - n + 1: end)
x.tail<n>()                        // x(end - n + 1: end)
x.segment(i, n)                    // x(i+1 : i+n)
x.segment<n>(i)                    // x(i+1 : i+n)
P.block(i, j, rows, cols)          // P(i+1 : i+rows, j+1 : j+cols)
P.block<rows, cols>(i, j)          // P(i+1 : i+rows, j+1 : j+cols)
P.row(i)                           // P(i+1, :)
P.col(j)                           // P(:, j+1)
P.leftCols<cols>()                 // P(:, 1:cols)
P.leftCols(cols)                   // P(:, 1:cols)
P.middleCols<cols>(j)              // P(:, j+1:j+cols)
P.middleCols(j, cols)              // P(:, j+1:j+cols)
P.rightCols<cols>()                // P(:, end-cols+1:end)
P.rightCols(cols)                  // P(:, end-cols+1:end)
P.topRows<rows>()                  // P(1:rows, :)
P.topRows(rows)                    // P(1:rows, :)
P.middleRows<rows>(i)              // P(i+1:i+rows, :)
P.middleRows(i, rows)              // P(i+1:i+rows, :)
P.bottomRows<rows>()               // P(end-rows+1:end, :)
P.bottomRows(rows)                 // P(end-rows+1:end, :)
P.topLeftCorner(rows, cols)        // P(1:rows, 1:cols)
P.topRightCorner(rows, cols)       // P(1:rows, end-cols+1:end)
P.bottomLeftCorner(rows, cols)     // P(end-rows+1:end, 1:cols)
P.bottomRightCorner(rows, cols)    // P(end-rows+1:end, end-cols+1:end)
P.topLeftCorner<rows,cols>()       // P(1:rows, 1:cols)
P.topRightCorner<rows,cols>()      // P(1:rows, end-cols+1:end)
P.bottomLeftCorner<rows,cols>()    // P(end-rows+1:end, 1:cols)
P.bottomRightCorner<rows,cols>()   // P(end-rows+1:end, end-cols+1:end)

4.矩阵中单个元素操作

R = P.array() * s.array();// 矩阵中每个元素相乘
R = P×Q;   // 矩阵相乘

5.解线性方程组Ax = b

x = A.ldlt().solve(b));  // A sym. p.s.d.    #include <Eigen/Cholesky>
x = A.llt() .solve(b));  // A sym. p.d.      #include <Eigen/Cholesky>
x = A.lu()  .solve(b));  // Stable and fast. #include <Eigen/LU>
x = A.qr()  .solve(b));  // No pivoting.     #include <Eigen/QR>
x = A.svd() .solve(b));  // Stable, slowest. #include <Eigen/SVD>

6.特征值和特征向量

const Eigen::EigenSolver<Eigen::MatrixXd> solver(covarianceMatrix);
eigenvalues = solver.eigenvalues().real();      //特征值Vector
eigenvectors = solver.eigenvectors().real();   //特征向量Matrix

7.SVD分解

JacobiSVD<Eigen::MatrixXd> svd(NN, ComputeThinU | ComputeThinV );
Matrix3d U = svd.matrixU();  //计算U
Matrix3d V = svd.matrixV();  //计算V
、、、
对于SVD分解,对于NN的维度有限制要求!!!

相关文章

网友评论

      本文标题:2019-02-26 Eigen库使用

      本文链接:https://www.haomeiwen.com/subject/yuzayqtx.html