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