数组索引¶
我们已经在本章看到很多说明如何索引数组的例子。因此,似乎没有必要专门用一节来讨论如何索引数组。的确,通常你只会使用在使用整数值下标以索引数组中的元素。但也有其它不少索引数组的方式,从而值得花一些时间来讨论。
索引¶
整数¶
数组索引从1开始
在用整数指定数组维度时,Modelica使用的索引是从1开始的。某些语言中选择使用零作为起始索引,但要指出Modelica是使用从1开始的索引。
很明显,最直接的方法来是使用整数去索引数组。数组声明如下:
Real x[5,4];
我们可以在首个下表使用1到5之间的整数、在第二个下标使用1到4之间的整数去索引数组的元素。
但值得指出的是, Modelica允许用向量作为下标。要理解向量指标是如何工作的,首先要考虑以下矩阵:
在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.A
、Species.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