数组索引

我们已经在本章看到很多说明如何索引数组的例子。因此,似乎没有必要专门用一节来讨论如何索引数组。的确,通常你只会使用在使用整数值下标以索引数组中的元素。但也有其它不少索引数组的方式,从而值得花一些时间来讨论。

索引

整数

数组索引从1开始

在用整数指定数组维度时,Modelica使用的索引是从1开始的。某些语言中选择使用零作为起始索引,但要指出Modelica是使用从1开始的索引。

很明显,最直接的方法来是使用整数去索引数组。数组声明如下:

Real x[5,4];

我们可以在首个下表使用1到5之间的整数、在第二个下标使用1到4之间的整数去索引数组的元素。

但值得指出的是, Modelica允许用向量作为下标。要理解向量指标是如何工作的,首先要考虑以下矩阵:

\[\begin{split}B = \left[ \begin{array}{ccc} 1 & 2 & 3 \\ 4 & 5 & 6 \\ 7 & 8 & 9 \end{array} \right]\end{split}\]

在Modelica语言,这样的数组将被声明如下:

parameter Real B[3,3] = [1, 2, 3; 4, 5, 6; 7, 8, 9];

想象,我们要从B提取一个如下的子矩阵:

parameter Real C[2,2] = [B[1,1], B[1,2]; B[2,1], B[2,2]]; // [1, 2; 4, 5];

用如下方法,我们可以更容易地用向量下标提取相同的子矩阵:

parameter Real C[2,2] = B[{1,2},{1,2}]; // [1, 2; 4, 5];

通过使用向量下标,我们可以提取或构造任意子数组。这就是范围表示法派上用场的时候了。同一个提取方法也可以用以下方法表示:

parameter Real C[2,2] = B[1:2,1:2]; // [1, 2; 4, 5];

枚举类

在前面的化学系统例子里,我们看到了如何用枚举类来指定数组的维度。然后,我们看到了如何通过一个enumeration类型的值来索引数组。一般来说,对于一个如下的enumeration值:

type Species = enumeration(A, B, X);

然后声明一个用enumeration指代维数的数组,即:

Real C[Species];

那么我们可以使用枚举值Species.ASpecies.B以及Species.X作为索引。例如:

equation
  der(C[Species.A]) = ...;

布尔值

我们可以用enumeration类型相同的当时使用Boolean类型。考虑声明有某一维定义为Boolean类型的数组:

Real C[5,Boolean];

然后我们可以使用布尔值索引该维度,如:

equation
  der(C[1,true]) = ...;
  der(C[1,false]) = ...;

end

当指定数组下标时,在下标表达式里使用end是合法使用的。在这种情况下,end对应数组维度的最大可能值。在表达式中,end允许用最后一个而不是第一个元素为基准进行索引。例如,要指代向量中的倒数第二个元素,那么可以用end-1表达式作为下标。

请记住,end相应的数组维度的最大可能索引值。因此,对于下面的数组:

Integer B[2,4] = [1, 2, 3, 4; 5, 6, 7, 8];

下面的表达式计算结果如下:

B[1,end]     // 4
B[end,1]     // 5
B[end,end]   // 8
B[2,end-1]   // 7

切片

Modelica语言中有另一种复杂的数组索引方式。但现在没有讨论的必要。在我们稍后讨论组件数组的时候,便会看到这个功能。