zoukankan      html  css  js  c++  java
  • Eigen学习笔记2-Matrix类

      在Eigen中,所有的矩阵Matrix和向量Vector都是由Matrix类构造的。向量只不过是矩阵的特殊形式,只有一列(列向量)或者一行。

      Matrix模板类有6个参数,其中前三个参数是必须的。前三个参数如下:

      Matrix<typename Scalar,int RowsAtCompileTime,int ColsAtCompileTime >

      Scalar 是 标量类型,取值可以是 float ,int double 等。

      RowsAtCompileTime 和 ColsAtCompileTime 是在程序编译时就已经知道的矩阵的行数和列数。

      Eigen 提供了一些常用的 定义好的类型。比如:

      typedef Matrix<float,4,4> Matrix4f .

      

      在Eigen中,列向量是默认向量,在不特别说明的情况下,向量Vector就是指的列向量。在Eigen中定义了列向量:

      typedef Matrix<float,3,1> Vector3f ;

      Eigen也定义了行向量:

      typedef Matrix<int ,1,2 > RowVector2i ;

      如果矩阵的尺寸在编译的时候是不确定的,而在运行的时候才能确定,Eigen提供了定义动态大小的方法。比如非常好用的:

      typedef Matrix<double ,Dynamic,Dynamic > MatrixXd;  

      MatrixXd定义了任意行数和列数的矩阵,可以在运行时确定。

      类似地,对于向量有:

      typedef Matrix<int ,Dynamic ,1> VectorXi ;

      也可以对于一个维度确定,而指定另外一个维度是动态大小的。

      Matrix<float,3,Dynamic> 矩阵的行数是 3,列数不确定。

      矩阵的构造,Eigen提供了默认构造函数。

      Matrix3f a;

      MatirxXf b;

      a 是一个3  x 3的矩阵,每个元素都是未初始化的float。

      b 目前是一个 0 x 0 的矩阵。

      带参数的构造函数,对于矩阵,行数在列数前面,对于向量,只有向量的大小。

      MatrixXf a(10,15);

      VectorXf b(30);

      a 是一个 10 x 15的动态大小的矩阵,分配了内存但是没有初始化。

      b 是一个动态大小的向量,大小是30,分配了内存但是没有初始化。

      对于维度在 4 以下的矩阵和向量,都定义了固定大小的类型。

      例如可以使用,

      Vector2d ; Vector3d  ; Vector4d; 等来定义向量。

      Matrix2f ;Matrix3f ; Matrix4f ; 等定义矩阵。

      可以使用逗号初始化方式给矩阵和向量赋值。例如:

      Matrix3f m;

      m << 1,2,3,

         4,5,6,

                     7,8,9;

         这样就将上述值赋给了矩阵,在Eigen中矩阵默认的存储方式是行优先,就是先存储行。

      Eigen支持对动态大小的矩阵和向量重新指定大小。

      rows() , cols() , size() 分别返回行数,列数和 元素的个数。

      resize() 则可以重新指定矩阵大小。

      实例如下;

      

     1 #include <iostream>
     2 #include <eigen3/Eigen/Dense>
     3 
     4 using namespace Eigen;
     5 
     6 
     7 int main(int argc ,char** argv)
     8 {
     9     MatrixXd m(2,5);
    10     m.resize(3,4);
    11     std::cout<<"The matrix m is of size "
    12              <<m.rows()<<" x "<<m.cols()<<std::endl;
    13     std::cout<<"It has"<<m.size()<<" coefficients"<<std::endl;
    14 
    15     VectorXd v(2;
    16     v.resize(5;
    17     std::cout<<"The vector v is of size "<<v.size()<<std::endl;
    18     std::cout<<"As a matrix, v is of size "
    19             <<v.rows()<<" x "<<v.cols()<<std::endl;
    20     
    21     return 0;
    22 }

     运行结果:

      

    赋值和resize

    对于动态大小的矩阵,使用操作符 = 的时候,左边的矩阵大小会根据右边的矩阵大小改变。

    例如:

     1 #include <iostream>
     2 #include <eigen3/Eigen/Dense>
     3 
     4 using namespace Eigen;
     5 
     6 
     7 int main(int argc ,char** argv)
     8 {
     9     Matrix2f a(2,2);
    10     std::cout<<"a is of size "<<a.rows()<<"x"<<a.cols()<<std::endl;
    11     MatrixXf b(4,4);
    12     a = b;
    13     std::cout<<"a is now of size "<<a.rows()<<"x"<<a.cols()<<std::endl;
    14     
    15     return 0;
    16 }

    运行结果如下:

     

    固定大小和动态大小

      对于小尺寸的矩阵,使用固定大小的方式,时间开销要小的多。

    Eigen 定义了相当多的方便使用的类型,其中还包括复数类型。

     MatrixNt ,VectorNt ,RowVectorNt 。

    N  : 2,3,4,X ;

    t : i ,f d ,cf cd.

     

      

      

      

    pp
  • 相关阅读:
    QT设置32bit 64bit编译
    windows应用程序无边框设置
    分组与聚合数据
    快速排序
    【leetcode】two sum --medium
    【leetcode】path sum--easy
    【leetcode】happy number--easy
    SQL函数
    数据库的高级设计
    c++笔试准备(二)数组全排的问题
  • 原文地址:https://www.cnblogs.com/wangxiaoyong/p/8903505.html
Copyright © 2011-2022 走看看