0. 为什么使用Array
相对于Matrix提供的线性代数运算,Array类提供了更为一般的数组功能。Array类为元素级的操作提供了有效途径,比如点加(每个元素加值)或两个数据相应元素的点乘。
1. Array
Array是个类模板(类似于Matrx),前三个参数是必须指定的,后三个是可选的,这点和Matrix是相同的。
Array<typename Scalar, int RowsAtCompileTime, int ColsAtCompileTime>
Eigen也提供的一些常用类定义,Array是同时支持一维和二维的(Matrix二维,Vector一维)。
2. 获取元素
读写操作重载于matrix, << 可以用于初始化array或打印。
1 #include <Eigen/Dense>
2
3 #include <iostream>
4
5 using namespace Eigen;
6
7 using namespace std;
8
9 int main()
10
11 {
12
13 ArrayXXf m(2,2);
14
15
16 // assign some values coefficient by coefficient
17
18 m(0,0) = 1.0; m(0,1) = 2.0;
19
20 m(1,0) = 3.0; m(1,1) = m(0,1) + m(1,0);
21
22
23 // print values to standard output
24
25 cout << m << endl << endl;
26
27
28 // using the comma-initializer is also allowed
29
30 m << 1.0,2.0,
31
32 3.0,4.0;
33
34
35
36 // print values to standard output
37
38 cout << m << endl;
39
40 }
3. 加法和减法
和matrix类似,要求array的尺寸一致。同时支持array+/-scalar的操作!
1 #include <Eigen/Dense>
2
3 #include <iostream>
4
5 using namespace Eigen;
6
7 using namespace std;
8
9 int main()
10
11 {
12
13 ArrayXXf a(3,3);
14
15 ArrayXXf b(3,3);
16
17 a << 1,2,3,
18
19 4,5,6,
20
21 7,8,9;
22
23 b << 1,2,3,
24
25 1,2,3,
26
27 1,2,3;
28
29
30
31 // Adding two arrays
32
33 cout << "a + b = " << endl << a + b << endl << endl;
34
35 // Subtracting a scalar from an array
36
37 cout << "a - 2 = " << endl << a - 2 << endl;
38
39 }
输出
a + b =
2 4 6
5 7 9
8 10 12
a - 2 =
-1 0 1
2 3 4
5 6 7
4. 乘法
支持array*scalar(类似于matrix),但是当执行array*array时,执行的是相应元素的乘积,因此两个array必须具有相同的尺寸。
1 int main()
2
3 {
4
5 ArrayXXf a(2,2);
6
7 ArrayXXf b(2,2);
8
9 a << 1,2,
10
11 3,4;
12
13 b << 5,6,
14
15 7,8;
16
17 cout << "a * b = " << endl << a * b << endl;
18
19 }
a * b =
5 12
21 32
1 int main()
2
3 {
4
5 ArrayXf a = ArrayXf::Random(5);
6
7 a *= 2;
8
9 cout << "a =" << endl
10
11 << a << endl;
12
13 cout << "a.abs() =" << endl
14
15 << a.abs() << endl;
16
17 cout << "a.abs().sqrt() =" << endl
18
19 << a.abs().sqrt() << endl;
20
21 cout << "a.min(a.abs().sqrt()) =" << endl
22
23 << a.min(a.abs().sqrt()) << endl;
24
25 }
6. array和matrix之间的转换
当需要线性代数类操作时,请使用Matrix;但需要元素级操作时,需要使用Array。这样就需要提供两者的转化方法。
Matrix提供了.array()函数将它们转化为Array对象。
Array提供了.matrix()函数将它们转化为Matrix对象。
在Eigen,在表达式中混合Matrix和Array操作是被禁止的,但是可以将array表达式结果赋值为matrix。
另外,Matrix提供了cwiseProduct函数也实现了点乘。
1 #include <Eigen/Dense>
2
3 #include <iostream>
4
5 using namespace Eigen;
6
7 using namespace std;
8
9 int main()
10
11 {
12
13 MatrixXf m(2,2);
14
15 MatrixXf n(2,2);
16
17 MatrixXf result(2,2);
18
19 m << 1,2,
20
21 3,4;
22
23 n << 5,6,
24
25 7,8;
26
27 result = m * n;
28
29 cout << "-- Matrix m*n: --" << endl << result << endl << endl;
30
31 result = m.array() * n.array();
32
33 cout << "-- Array m*n: --" << endl << result << endl << endl;
34
35 result = m.cwiseProduct(n);
36
37 cout << "-- With cwiseProduct: --" << endl << result << endl << endl;
38
39 result = m.array() + 4;
40
41 cout << "-- Array m + 4: --" << endl << result << endl << endl;
42
43 }
输出
-- Matrix m*n: --
19 22
43 50
-- Array m*n: --
5 12
21 32
-- With cwiseProduct: --
5 12
21 32
-- Array m + 4: --
5 6
7 8
类似, array1.matrix() * array2.matrix() 将执行矩阵乘法。