C++矩阵库Eigen使用教程

eigen 使用梳理与记录

eigen 官方文档

https://eigen.tuxfamily.org/dox/group__TutorialArrayClass.html

https://www.codenong.com/cs105391280/

array和vector、 tensor、 martix 的说明

vector tensor martix:其中 vector tensor martirx 的运算执行矩阵的规则,线性代数运算.即矩阵的加减以及数乘,在这几个类别中,矩阵与常量的加法是不被允许的

array:

eigen 初始化

  • 用一维vetor 初始化

数据类型

静态矩阵和向量

  • typedef Matrix<float, 4, 4> Matrix4f
  • typedef Matrix<float, 3, 1> Vector3f :列向量
  • typedef Matrix<int, 1, 2> RowVector2i :行向量

动态矩阵和向量

  • typedef Matrix<double, Dynamic, Dynamic> MatrixXd;此时只有一个X表示动态
  • typedef Matrix<int, Dynamic, 1> VectorXi
  • Matrix<float, 3, Dynamic>

特殊类型Array

TypeTypedef
Array<float,Dynamic,1>ArrayXf
Array<float,3,1>Array3f
Array<double,Dynamic,Dynamic>ArrayXXd与Matrix 不同
Array<double,3,3>Array33d必须是ArrayNNt类型

补充说明

ArrayXXd df(9,1) <==> ArrayXd df(9,1)

类型转换

max.cast<type>()

构造函数,初始化

  • 矩阵初始化:

    Matrix3f a;

    MatrixXf b;

    MatrixXf a(10,15);

    VectorXf b(30);

  • 赋值方法

    eigen 默认的存储方式是列优先,

    typedef Matrix<double, Dynamic, Dynamic,RowMajor>rMatrixXd;//定义矩阵行优

    1. 确定矩阵,使用索引赋值

      MatrixXd m(2,2);
      m(0,0) = 3;
      m(1,0) = 2.5;
      m(0,1) = -1;
      
    2. 使用<<,此时矩阵的形状必须确定

      Matrix3d m;
      m << 1,2,3,
          4,5,6,
          7,8,9;
      cout << m << endl;
      
    3. 大小不确定矩阵,如MatrixXd waypoints_;VectorXd timepoints_;赋值前使用resize;否则会出现如下错误:

      ./eigen/Eigen/src/Core/CommaInitializer.h:36: Eigen::CommaInitializer<MatrixType>::CommaInitializer(XprType&, const Scalar&) [with XprType = Eigen::Matrix<float, -1, -1>; Eigen::CommaInitializer<MatrixType>::Scalar = float]: Assertion `m_xpr.rows() > 0 && m_xpr.cols() > 0 && "Cannot comma-initialize a 0x0 matrix (operator<<)"' failed.
      
  • 取值

    max(i,j)

内存映射map

  • vector 转 eigen类型

    不同类型的结构数据存储结构之间进行内存映射,例如,把opencv 的mat 转换为eigen 的 matrix, 或者std::vector 填入matrix。可以在不进行拷贝的情况下进行使用eigen 的map 功能内存映射。

    例如:

    int array[9];
    Eigen::Map<MatrixXi> mat(array,3,3); //Map <类型> 变量名(地址,形状)
    //高维矩阵
    Eigen::TensorMap<
    
  • eigen 转vector,利用地址映射

    Eigen::VectorXd p{1,2,3};
    std::vector<double>arg(&p[0], p.data()+p.cols()*p.rows());
    
    

切片和索引

  1. 矩阵的块操作

    matrix.block(i,j,p,q);     //(1)
    matrix.block<p,q>(i,j);   //(2)
    

    定义(1) 表示返回从矩阵的(i,j)开始,每行取p个元素,每列取q个元素;返回新的临时矩阵,原矩阵元素不变。

    定义(2)和(1)结果一样,可理解为获取一个p行,q列的子矩阵,起始位置从 (i,j) 开始。

    通过上述方式获取的子矩阵可以作为左值(也就是给该对象赋值),也可以作为右值(用该矩阵给其他矩阵赋值)

  2. 向量的块操作

    获取向量的前n个元素:vector.head(n);

    获取向量尾部的n个元素:vector.tail(n);

    获取从向量的第i个元素开始的n个元素:vector.segment(i,n);

  3. 索引

    functiondescriptionexample
    seq(firstIdx,lastIdx)represents the sequence of integers ranging from firstIdx to lastIdxseq(2,5) <=> {2,3,4,5}
    seq(firstIdx,lastIdx,incr)same but using the increment incr to advance from one index to the nextseq(2,8,2) <=> {2,4,6,8}
    seqN(firstIdx,size)represents the sequence of size integers starting from firstIdxseqN(2,5) <=> {2,3,4,5,6}
    seqN(firstIdx,size,incr)same but using the increment incr to advance from one index to the nextseqN(2,3,3) <=> {2,5,8}
    IntentCodeBlock-API equivalence
    Bottom-left corner starting at row i with n columnsA(seq(i,last), seqN(0,n))A.bottomLeftCorner(A.rows()-i,n)
    Block starting at i,j having m rows, and n columnsA(seqN(i,m), seqN(i,n))A.block(i,j,m,n)
    Block starting at i0,j0 and ending at i1,j1A(seq(i0,i1), seq(j0,j1)A.block(i0,j0,i1-i0+1,j1-j0+1)
    Even columns of AA(all, seq(0,last,2))
    First n odd rows AA(seqN(1,n,2), all)
    The last past one columnA(all, last-1)A.col(A.cols()-2)
    The middle rowA(last/2,all)A.row((A.rows()-1)/2)
    Last elements of v starting at iv(seq(i,last))v.tail(v.size()-i)
    Last n elements of vv(seq(last+1-n,last))v.tail(n)
  4. 条件筛选

    没有直接的条件筛选,可以通过求最值坐标得方式实现

    比较运算

    ret = array>scale;
    ret2 = array<scale;
    ret2 and ret;
    
  • 19
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值