对 Stateflow 结构体进行索引并赋值
此示例说明如何访问和修改 Stateflow® 结构体的内容或 Stateflow 结构体的数组。Stateflow 结构体是您从 对象定义的一种数据类型。您可以使用 Stateflow 结构体将不同大小和类型的数据一起捆绑到一个数据对象中。有关详细信息,请参阅Access Bus Signals。Simulink.Bus (Simulink)
对子结构体和字段进行索引
要对 Stateflow 结构体的子结构体和字段进行索引,请使用圆点表示法。名称的第一部分标识父结构体。后续部分标识层次化路径上的各个子级。这些子级可以是单个字段,也可以是包含其他结构体(也称为子结构体)的字段。Stateflow 结构体的字段名称与定义该结构体的 Simulink.Bus 对象的元素名称一致。当一个字段包含向量、矩阵或数组时,您可以使用图的动作语言支持的索引表示法来访问其元素。
例如,此模型中的图包含一个输入结构体 (in)、一个输出结构体 (out)、一个局部结构体 (localbus) 和一个局部结构体数组 (subBusArray)。
该图使用
Simulink.Bus对象BusObject定义输入结构体in、输出结构体out和局部结构体localbus。这些结构体有四个字段:sb、a、b和c。字段
sb是从Simulink.Bus对象SubBus定义的子结构体。此子结构体有一个名为ele的字段。该图使用
Simulink.Bus对象SubBus定义局部结构体数组subBusArray。该数组的大小为 4。该数组中的每个元素均为结构体,其中包含一个名为ele的字段。

此列表列举了基于此示例的结构体设定将圆点表示法和数值索引进行组合的表达式:
in.c- 输入结构体in的字段cin.a(1)- 输入结构体in的向量场a的第一个元素out.sb- 输出结构体out的子结构体sbout.sb.ele- 子结构体out.sb的字段eleout.sb.ele(2,2)- 子结构体out.sb的字段ele的第二行第二列中的元素subBusArray(1)- 结构体数组subBusArray的第一个元素subBusArray(1).ele- 结构体subBusArray(1)的字段elesubBusArray(1).ele(3,4)- 结构体subBusArray(1)的字段ele的第三行第四列中的元素
由于图使用 MATLAB® 作为动作语言,您可以使用由括号分隔的从 1 开始的索引来访问此示例中数组的元素。在使用 C 语言作为动作语言的图中,使用由方括号分隔的从 0 开始的索引。有关详细信息,请参阅Stateflow 中向量和矩阵的运算。
为结构体和字段赋值
您可以写入作用域不是 Input 的任何 Stateflow 结构体。您可以为整个结构体、子结构体或单个字段赋值。
要将一个结构体赋给另一个结构体,请在基础工作区中基于同一
Simulink.Bus对象定义这两个结构体。要将一个结构体赋给另一个结构体的一个子结构体(或者反之),请基于同一
Simulink.Bus对象定义该结构体和子结构体。要将一个结构体的字段赋给另一个结构体的字段,这些字段必须具有相同的类型和大小。您可以基于不同
Simulink.Bus对象定义 Stateflow 结构体。
例如,此示例中的图进行以下赋值:
localbus = sb2abc(in.sb)- 结构体localbus和 MATLAB 函数sb2abc的输出参量是基于相同的Simulink.Bus对象BusObject定义的。该函数将其输入分解为三个组成部分:一个向量、一个 3×2 矩阵和一个标量。该函数将这些组成部分作为其输出的字段a、b和c返回。有关此函数的详细信息,请参阅在 MATLAB 函数中访问 Simulink 总线信号。subBusArray(1) = in.sb- 结构体subBusArray(1)和子结构体in.sb基于相同的Simulink.Bus对象SubBus进行定义。subBusArray(2) = abc2sb(in)- 结构体subBusArray(2)和图形函数abc2sb的输出参量是基于相同的Simulink.Bus对象SubBus定义的。该函数将来自其输入的字段a、b和c的值组合在一起,并重排入一个int8类型的 3×3 矩阵中。它将此矩阵以其输出的字段ele形式返回。subBusArray(3).ele = transpose(in.sb.ele)- 字段subBusArray(3).ele的类型和大小与transpose(in.sb.ele)的结果相同。两者均为int8类型的 3×3 矩阵。subBusArray(4).ele = int8(magic(3))- 字段subBusArray(4).ele的类型和大小与int8(magic(3))的结果相同。两者均为int8类型的 3×3 矩阵。out = localbus-out和localbus均基于相同的Simulink.Bus对象BusObject进行定义。out.sb = subBusArray(idx)- 子结构体out.sb和结构体subBusArray(idx)基于相同的Simulink.Bus对象SubBus进行定义。

运行仿真
当您对该示例进行仿真时,Stateflow 图使用输入结构体的字段 sb 的值来填充输出结构体的字段 a、b、c。参数 idx 选择结构体数组 subBusArray 的元素以用作输出的子结构体 sb。在此示例中,idx 等于 2,因此图使用输入结构体的字段 a、b、c 的值来填充子结构体。

当您对 idx 使用其他各值时,子结构体 out.sb 将分别包含与 in.sb、in.sb 的转置或一个 3×3 幻方相同的值。
另请参阅
Simulink.Bus (Simulink)