數組類和基于元素的操作 數組類不同于矩陣類,提供可以基于元素的操作; 數組類型不同于矩陣類型,它提供基于元素的操作,例如數組中每個元素增加一個常數、兩個數組對應元素相乘; 數組類是一個模板類,具有與矩陣相同的模板參數,重點也是前三個參數: Array<
typename Scalar, //數組元素類型 int RowsAtCompileTime, //行數 int ColsAtCompileTime> //列數 Eigen也有自定義數組,形如ArrayNt的表示一維數組,N和t分別表示數組尺寸和元素類型,形式如ArrayNNt表示二位數組,NN和t分別表示數組尺寸和元素類型:
Array<float,Dynamic,1> ArrayXf Array<float,3,1> Array3f Array<double,Dynamic,Dynamic> ArrayXXd Array<double,3,3> Array33d 括號運算符,重載為具有寫和讀數組元素的權限,類似于矩陣;因此,<<運算符用于初始化數組或打印; Eigen::ArrayXXf m(2,2); //基于元素進行賦值 m(0,0) = 1.0; m(0,1) = 2.0; m(1,0) = 3.0; m(1,1) = m(0,1) + m(1,0); // 將數組輸出 cout << m << endl << endl; // 使用逗號運算符賦值 m << 1.0,2.0, 3.0,4.0; // 輸出數組 cout << m << endl;
兩個矩陣相加或相減與矩陣相同,如果兩個數組尺寸相同則運算有效;加法和減法可以基于元素進行; 數組也支持表達式形如array+scalar運算,即將一個常量標量加到數組每個元素上,矩陣不具有該能力; Eigen::ArrayXXf a(3,3); Eigen::ArrayXXf b(3,3); a << 1,2,3, 4,5,6, 7,8,9; b << 1,2,3, 1,2,3, 1,2,3; // 兩個數組求和 cout << "a + b = " << endl << a + b << endl << endl; // 從數組每個元素減去一個標量 cout << "a - 2 = " << endl << a - 2 << endl;
Eigen::ArrayXXf a(2,2); Eigen::ArrayXXf b(2,2); a << 1,2, 3,4; b << 5,6, 7,8; cout << "a * b = " << endl << a * b << endl;
abs():絕對值運算; sqrt():平方根運算; min():兩個數組對應位置最小值; Eigen::ArrayXf a = ArrayXf::Random(5); a *= 2; cout << "a =" << endl << a << endl; cout << "a.abs() =" << endl << a.abs() << endl; cout << "a.abs().sqrt() =" << endl << a.abs().sqrt() << endl; cout << "a.min(a.abs().sqrt()) =" << endl << a.min(a.abs().sqrt()) << endl;
如果需要進行線性代數運算,則使用矩陣表達式; 如果需要進行基于元素運算,則使用數組表達式; 矩陣表達式->數組表達式:矩陣表達式.array(); 數組表達式->矩陣表達式:數組表達式.matrix(); .array() 和 .matrix() 都可以作為左值或者右值; 在eigen中,矩陣和數組不可以在表達式中混用,但是賦值運算符除外可以將一個矩陣賦給數組或者反之; Eigen:MatrixXf m(2,2); Eigen::MatrixXf n(2,2); Eigen::MatrixXf result(2,2); m << 1,2, 3,4; n << 5,6, 7,8; result = m * n; cout << "-- Matrix m*n: --" << endl << result << endl << endl; result = m.array() * n.array(); cout << "-- Array m*n: --" << endl << result << endl << endl; result = m.cwiseProduct(n); // Eigen中提供的矩陣對應元素相乘.cwiseProduct(.) cout << "-- With cwiseProduct: --" << endl << result << endl << endl; result = m.array() + 4; cout << "-- Array m + 4: --" << endl << result << endl << endl;
注:本文參考自https://eigen./dox/group__TutorialArrayClass.html
|