一杯清酒邀明月
天下本无事,庸人扰之而烦耳。

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

5. 其他元素级操作

 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() 将执行矩阵乘法。

posted on 2022-07-06 15:27  一杯清酒邀明月  阅读(269)  评论(0编辑  收藏  举报