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() 方法。

 

 

  

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM