0%

Array类与系数级操作

本章介绍Eigen中的Array类。

Matrix类主要面向线性代数,Array类则提供更普遍意义上的数组操作,允许进行没有具体线代意义的系数级运算,例如给每个系数加上一个常数,或将两个数组按系数相乘等。

类型

Array的六个模板参数和Matrix一模一样,并且也定义了一些常用类型

  • ArrayNt :表示一个一维数组,N 为数组大小,t 为数值类型
  • ArrayNNt :表示一个二维数组
1
2
3
4
typedef Array<float, Dynamic, 1> ArrayXf;
typedef Array<float, 3, 1> Array3f;
typedef Array<double, Dynamic, Dynamic> ArrayXXd;
typedef Array<double, 3, 3> Array33d;

访问系数

与Matrix相同,Array也是通过重载括号运算符 () 实现对数组系数的读写操作;重载 << 操作符逗号初始化数组或打印数组。

加减法

与Matrix相同,当两个数组大小相同时操作有效,且加减法按系数进行;

与Matrix不同,Array也支持 array+scalar 的操作,即向Array中的每个系数加上同一个常数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <eigen3/Eigen/Eigen>

using namespace Eigen;
using namespace std;

int main()
{
ArrayXXf a(3,3);
ArrayXXf b(3,3);
a << 1,2,3,
4,5,6,
7,8,9;
b << 1,2,3,
1,2,3,
1,2,3;

// Adding two arrays
cout << "a + b = " << endl << a + b << endl << endl;

// Subtracting a scalar from an array
cout << "a - 2 = " << endl << a - 2 << endl;
}

输出:

1
2
3
4
5
6
7
8
9
a + b = 
2 4 6
5 7 9
8 10 12

a - 2 =
-1 0 1
2 3 4
5 6 7

乘法

  • array * scalarscalar * array :同Matrix
  • array * array :与Matrix不同。Matrix进行的是矩阵乘法,Array则是系数对应相乘。因此当且仅当两个数组维度相同时,才能相乘。
1
2
3
4
5
6
7
8
9
10
int main()
{
ArrayXXf a(2,2);
ArrayXXf b(2,2);
a << 1,2,
3,4;
b << 5,6,
7,8;
cout << "a * b = " << endl << a * b << endl;
}

输出:

1
2
3
a * b = 
5 12
21 32

其他系数级操作

参考Eigen手册 Quick Reference Guide : Coefficient-wise & Array operators

Array 与 Matrix 类型转换

  • Array -> Matrix : A.matrix()
  • Matrix -> Array : M.array()

Eigen禁止在一个表达式中混用Array和Matrix,唯一例外的是 赋值运算 ,它允许Array和Matrix的互相赋值。

Eigen也为Matrix提供了一些 cwise*() 的方法使其允许直接进行系数级操作,类似 .array().*()