• Eigen学习之Array类


      Eigen 不仅提供了Matrix和Vector结构,还提供了Array结构。区别如下,Matrix和Vector就是线性代数中定义的矩阵和向量,所有的数学运算都和数学上一致。但是存在一个问题是数学上的定义并不一定能完全满足现实需求。比如,数学上并没有定义一个矩阵和一个标量的加法运算。但是如果我们想给一个矩阵的每个元素都加上同一个数,那么这个操作就需要我们自己去实现,这显然并不方便。

      Array提供了一个Array类,为我们提供了大量的矩阵未定义的操作,且Array和Matrix之间很容易相互转换,所以相当于给矩阵提供更多的方法。也为使用者的不同需求提供了更多的选择。

      下面看一下Array类的实现。Array类和Matrix有相同的参数。

      Array<typename Scalar, int RowsAtCompileTime , int ColsAtCompileTime >

     上面参数的意义和Matrix中参数的意义是相同的。

      Array也对常用的情况作了一些类型定义。

      typedef Array<float ,Dynamic,1>  ArrayXf;

      typedef Array<float,3,1>              Array3f;

      typedef Array<double,Dynamic ,Dynamic > ArrayXXd;

      typedef Array<double ,3,3 >                      Array33d;

      从上面的几种类型可以看出,Array和Matrix还是存在微小的差别。

      访问 Array中元素

      圆括号 ( ) 被重载用来访问Array中的元素。

      举例如下:

      

     1 #include <iostream>
     2 #include <eigen3/Eigen/Dense>
     3 
     4 using namespace Eigen;
     5 using namespace std;
     6 
     7 int main(int argc ,char** argv)
     8 {
     9     ArrayXXf m(2,2);
    10 
    11     // 给元素单个赋值
    12     m(0,0) = 1.0;m(0,1) = 2.0;
    13     m(1,0) = 3.0;m(1,1) = m(0,1) + m(1,0);
    14     cout<<m<<endl<<endl;
    15     
    16     // 也可以使用逗号方式赋值
    17     m<<5.0,6.0,
    18        7.0,8.0;
    19     cout<<m<<endl;
    20     
    21     return 0;
    22 }

    运行结果如下:

      加法和减法

      对两个Array进行加法和减法是和Matrix一样,这个操作只要两个Array维度相同,元素类型相同就可以操作。同时Array还定义了Matrix不支持的

    对Array 和 一个标量进行的操作。举例如下:

      

     1 #include <iostream>
     2 #include <eigen3/Eigen/Dense>
     3 
     4 using namespace Eigen;
     5 using namespace std;
     6 
     7 int main(int argc ,char** argv)
     8 {
     9     ArrayXXf a(3,3);
    10     ArrayXXf b(3,3);
    11 
    12     a << 1,2,3,
    13          4,5,6,
    14          7,8,9;
    15     
    16     b << 1,2,3,
    17          1,2,3,
    18          1,2,3;
    19 
    20     cout<<"a + b = "<<endl<<a+b<<endl<<endl;
    21 
    22     cout<<"a - 2 = "<<endl<<a-2<<endl;
    23     
    24     return 0;
    25 }

    运行结果如下:

      

      乘法操作

      对于一个Array和标量进行乘法操作是和Matrix一样的,同时Array也定义了两个Array之间的乘法操作,就是将两个Array的对于元素相乘。

      举例如下:

      

     1 using namespace Eigen;
     2 using namespace std;
     3 
     4 int main(int argc ,char** argv)
     5 {
     6     ArrayXXf a(2,2);
     7     ArrayXXf b(2,2);
     8 
     9     a << 1,2,
    10          3,4;
    11 
    12     b << 5,6,
    13          7,8;
    14     cout<<"a * b = "<<endl<<a*b<<endl<<endl;
    15     
    16     return 0;
    17 }

      运行结果如下:

      

      可以看到执行了对于元素的乘法。

      其它的元素操作

      Array 还定义了 绝对值 abs() ,开平方根sqrt() , 以及找对应元素最小值操作 min() ;

      举例如下:

      

     1 #include <iostream>
     2 #include <eigen3/Eigen/Dense>
     3 
     4 using namespace Eigen;
     5 using namespace std;
     6 
     7 int main(int argc ,char** argv)
     8 {
     9     ArrayXf a = ArrayXf::Random(5);
    10     a *= 2;
    11     cout<<"a = "<<endl
    12         <<a<<endl;
    13     cout<<"a.abs() = "<<endl
    14         <<a.abs()<<endl;
    15     cout<<"a.abs().sqrt() ="<<endl
    16         <<a.abs().sqrt()<<endl;
    17     cout<<"a.min(a.abs().sqrt()) = "<<endl
    18         <<a.min(a.abs().sqrt())<<endl;
    19     return 0;
    20 }

      运行如下:

      

      

      Array 和 Matrix 之间可以方便地进行转换。

      Array 有  .matrix() 方法。

      Matrix 有 .array() 方法。

      

      

    pp
  • 相关阅读:
    AttributeError: module 'scipy.misc' has no attribute 'imread'
    3.形态学
    2.几何变换_图像金字塔
    ValueError:Object arrarys cannot be loaded when allow_pickle=False
    2.几何变换_切分合并通道
    2.几何变换_遮挡
    49. Group Anagrams
    151. Reverse Words in a String
    242. Valid Anagram
    227. Basic Calculator II
  • 原文地址:https://www.cnblogs.com/wangxiaoyong/p/8904108.html
Copyright © 2020-2023  润新知