2.6.2 数组构造
数组构造器提供了简便的方式来生成数组。数组构造器实质上是一个函数,实参为标量或数组,返回一个数组。数组构造器函数为:
等价的简写形式为:
其构造数组的规则为:每调用数组构造器一次,参数维度的左侧被加1后,参数作为结果而返回,新增维度的长度等于参数的个数。例如,{1,2}构造一个1维数组,该维长度为2;{{1,2}}构造一个2维数组,维度及其大小为1×2。该规则可以用一个公式来描述:ndims(array(A))=ndims(A)+1。ndims(A)表示数组A的维度。
建议用户在构造多维数组时尽量使用简写形式的数组构造器{},以增强代码的可读性。
使用数组构造器还必须满足以下几个条件:
(1)每个参数的维度必须相等,即每个参数具有相同的维数,并且每一维的长度均相等。
(2)每个参数的类型必须等价,实型与整型子类型可以混合使用,如{1.2,3}。
(3)参数个数至少为1。例如:
2.6.2.1 范围向量构造
范围向量是指向量元素取值于一个数值区间内的固定间距点。例如{1,3,5,7,9}是数值1~9的区间内、以间距2进行取值后的集合。Modelica规范提供了一种便利的方式来构造范围向量:
该表达式称为“范围向量构造表达式”,简称“范围表达式”。其中,步长表达式deltaexpr是可选的,如果不指定步长,则默认为1。范围表达式可用于构造整型、布尔类型以及枚举类型的范围向量,使用规则定义为:
(1)表达式j:k,如果j和k是整型,则表示整型向量{j,j+1,…,k};如果是实型,则表示实型向量{j,j+1.0,…,j+n},其中n=floor(k-j)。
(2)表达式j:d:k,如果是整型,则表示整型向量{j,j+d,…,j+n*d},其中n=(k-j)/d;如果是实型,则表示实型向量{j,j+d,…,j+n*d},其中n=floor((k-j)/d)。
(3)表达式false:true表示布尔类型向量{false,true}。
(4)表达式j:j表示{j},j可以是整型、实型、布尔类型或枚举类型。
(5)表达式E.ei:E.ej表示枚举类型向量{E.ei,…,E.ej},其中,E.ej和E.ei均为枚举类型E中定义的元素,并且要求E.ej>E.ei。
例如:
2.6.2.2 带迭代器的数组构造
迭代器用于表示数学中“集合”的概念。如下数学格式描述的集合:
在Modelica中可用下面的语句表示:
或
带两个迭代器的数组构造器可如下表示:
其通用语法格式为:
其中,“iterators”表示多个迭代器,迭代器之间用逗号分隔,格式如下:
迭代器中的范围表达式必须是向量,并且必须保证向量的每个元素都能够在编译时被估值。迭代表达式中的迭代变量ident的作用域仅限于表达式内部。标识符ident会覆盖其封闭作用域中可能存在的同名标识符。
仅带单个迭代器的数组构造表达式,其结果为向量,是通过将迭代表达式中的每个元素值依次代入上述表达式expression中进行运算构造的,例如:
如果迭代器中的迭代变量作为expression中的下标索引,迭代器中的范围表达式可以省略不写,迭代范围可被自动推导。
带多个迭代器的数组构造是矩阵或多维数组构造的简化记法。其转化方法是先将多个迭代器按声明顺序反向,然后将迭代器之间的“,”替换为“}for”,并在整个数组构造器前面补充“{”。例如:
带迭代器的数组构造在定义一些特殊的矩阵时非常有用,例如下列语句构造了一个对角线元素为1的矩阵: