zoukankan      html  css  js  c++  java
  • 【1】EIGEN-Matrix类

    在Eigen中,所有的矩阵和向量都是Matrix模板类的对象,向量只是一种特殊的矩阵。

    Matrix的三个模板参数

    Matrix类接受6个模板参数,要说的这三个参数是强制性的,其他三个有默认值。
    Matrix<typename Scalar, int RowsAtCompileTile, int ColsAtCompileTime>
    参数含义:
    - Scalar是可选标量类型,如想要float类型的矩阵,则选择相应的表示float类型的值;
    - RowAtCompileTypeColsAtCompileType是矩阵在编译时就已经确定的行数和列数,这类似于C的数组;

    Eigen 已经有很多内置的Matrix类型,例如Matrix4f表示的是4x4的float类型的矩阵,可直接使用。
    Vector3f表示3x1的float类型的列向量,RowVector2i表示1x2的int类型的行向量。
    VectorNtMatrixNt分别表示向量和矩阵,其中N可以取值为2、3、4、N;t可以取值为ifdcf表示复数浮点数、cd表示复数double数,其他类型请查看手册。

    Matrix的动态维度

    通过Dynamic关键词设置Matrix维度为运行时确定,例如MatrixXd定义为typedef Matrix<double, Dynamic, Dynamic> MatrixXd;

    构造函数

    Eigen的矩阵有默认构造函数,该函数不会进行任何动态内存申请,也不会初始化任何矩阵元素。例如,

    Matrix3f a;
    MatrixXf b;
    

    a是一个3x3矩阵,实际上是float[9]的未初始化数组;而b是一个0x0的浮点类型的动态矩阵,其数组元素值还未申请。

    也有能对矩阵尺寸赋值的构造函数,例如,

    MatrixXf a(10,15);
    VectorXf b(30);
    

    对于矩阵,总是行数、再列数,a是一个10x15的浮点类型矩阵,空间已经申请但是未初始化;b是一个大小未30的可变向量,空间已经申请但是未初始化。

    Eigen对4以下的向量提供了初始化元素的构造函数,例如,

    Vector2d a(5.0, 6.0);
    Vector3d b(5.0, 6.0, 7.0);
    Vector4d c(5.0, 6.0, 7.0, 8.0);
    

    矩阵索引

    所有Eigen矩阵默认都是以列形式存储,但是可转换为行存储。m(index)并不一定表示向量,这与矩阵的存储形式有关系。运算符[]在向量中被重载,但是c++不允许接受一个以上的参数,以m[i,j]形式访问m元素,会错误。

    使用逗号表达式进行初始化

    Matrix3f m;
    m << 1, 2, 3,
         4, 5, 6,
         7, 8, 9;
    

    Resizing调整维度

    可以通过rows()/cols()/size()获得矩阵当前的行数、列数和总元素数,使用resize()函数必须保证调整后的size和原来的是一致的,否则会造成元素值出现不可预期状况;不可对固定维度的矩阵进行维度变换,会造成断言失败。

    赋值时,将左侧可变维度矩阵先resize,然后再将元素值拷贝,如果左侧是固定维度类型的矩阵赋值,是不允许赋不同维度类型的矩阵的。

    固定维度的矩阵定义实际上存储形式维array,在效率与执行速度、存储等方面具有优势。而动态矩阵总是在堆上进行空间申请。

    可选参数值

    Matrix<typename Scalar,
           int RowsAtCompileTime,
           int ColsAtCompileTime,
           int Options = 0,
           int MaxRowsAtCompileTime = RowsAtCompileTime,
           int MaxColsAtCompileTime = ColsAtCompileTime>
    

    Options是一个位域,确定矩阵是按行存储,还是列存储,默认是列存储。
    MaxRowsAtCompileTimeMaxColsAtCompileTime是矩阵维度在编译时未知,但是可以知道上限,有时可以避免动态内存申请。例如,Matrix<float, Dynamic, Dynamic, 0, 3, 4>,总数位12,不会动态申请。

  • 相关阅读:
    windows中administrator 和 administrators两个账户的区别
    如何去掉打印网页时自带的网址以及页码等内容
    Oracle左连接,右连接
    oracle服务器本地能够登录但是局域网内其他机器不能访问的解决方法
    错误Name node is in safe mode的解决方法
    oracle数据库中对varchar类型求max的解决方法
    JBoss中配置数据源出现错误:“Failed to register driver for: com.mysql.jdbc.Driver”的解决方法
    学习junit和hamcrest的使用
    Ubuntu10.10如何给用户添加sudo权限
    ORACLE 9i卸载并重新安装
  • 原文地址:https://www.cnblogs.com/imagezy/p/7845209.html
Copyright © 2011-2022 走看看