自学内容网 自学内容网

Scade 表达式 - 使用索引的迭代器

Scade 表达式中的 map, fold, mapfold,会对输入数组参数中的元素逐个作处理,不需要数组元素的索引信息。若在处理数组元素时,需要数组元素相应的索引信息,则可使用迭代器算子 mapi, foldi, mapfoldi

mapi 算子

mapi 算子的行为与 map 相似,都会对输入数组的所有元素进行处理,并输出新的数组。mapi 的语法定义为

(mapi operator <<expr>>) (list)

mapi 与 map 的不同点在于,对 operator 算子,输入参数列表的首项参数需为整数类型。在 mapi 执行时,输入的值为当前周期处理的元素对应的索引值。

例子

在下面的例子中 mapi 表达式 (mapi subOp <<10>>)(i1, i2) 内处理数组元素的算子为 subOp。可以注意到,subOp 的函数签名中,首项输入参数 index 的含义为当前周期处理的元素对应的索引值。

function mapiOp(i1,i2: int8 ^10) returns (o: int8 ^10)
  o = (mapi subOp <<10>>)(i1, i2);

function #pragma kcg expand #end subOp(index: int8; i1,i2: int8) returns (o: int8)
let
  o = if (index mod 2 = 0)
      then
        (i1 + i2)
      else
        (i1 - i2)
      ;
tel

foldi 算子

foldi 算子的作用与 fold 相似。不同点在于对输入数组的元素进行处理时,会提供元素相应的索引信息。

foldi 的语法定义如下

(foldi operator <<expr>>) (list)

其中 operator 算子的输入参数列表中的第一项参数需为整型。在运行期间的语义中,该项参数指示当前周期处理的数组元素的索引。

例子

在以下例程中,foldi 表达式 (foldi subOp <<3>>)(0, i1, i2) 中,subOp 的输入参数列表中,首项参数index 为当前周期处理元素的索引。

function foldiOp(i1,i2: int8 ^3) returns (o: int8)
   o = (foldi subOp <<3>>)(0, i1, i2);

function #pragma kcg expand #end
subOp(index: int8; acc: int8; elem1,elem2: int8)
returns (o: int8)
  o = if (index mod 2 = 0) then (acc + elem1 + elem2) else (acc);

mapfoldi 算子

mapfoldi 算子的效果同 mapfold 类似,可同时提供 map 的效果与 fold 的效果。mapfoldi 与 mapfold 的不同点在于,在处理数组元素时,mapfoldi 将提供输入数组元素对应的索引信息。

mapfoldi 的语法定义如下

(mapfoldi [[INTEGER]] operator <<expr>>)(list) 

例子

在以下例程中,对 mapfoldi 表达式 (mapfoldi 2 subOp <<10>>)(0, 0, i1, i2),算子subOp 的输入参数的首项参数 idx 为当前周期处理元素在输入数组中的索引。

function mapfoldiOp(i1,i2: float32 ^10)
returns (o_acc1, o_acc2: float32; o_arr1, o_arr2: float32 ^10)
  o_acc1, o_acc2, o_arr1, o_arr2 = (mapfoldi 2 subOp <<10>>)(0, 0, i1, i2);

function
#pragma kcg expand #end
subOp(idx: int8; acc1,acc2: float32; i1,i2: float32)
returns (o_acc1, o_acc2, o1, o2: float32)
let
  o_acc1 = if (idx mod 2 = 0) then (acc1 + i1 + i2) else acc1;
  o_acc2 = if (idx mod 2 <> 0) then (acc2 + i1 - i2) else acc2;
  o1 = if (idx mod 2 = 0) then i1 else i2;
  o2 = if (idx mod 2 = 0) then i2 else i1;
tel

原文地址:https://blog.csdn.net/mozart_cai/article/details/145268736

免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!