结matlab结构体索引元素,对 Stateflow 结构体进行索引并赋值
对子结构体和字段进行索引要对 Stateflow 结构体的子结构体和字段进行索引,请使用圆点表示法。名称的第一部分标识父对象。后续部分标识层次化路径上的各个子级。当父级为结构体时,其子级为单个字段或包含其他结构体(也称为子结构体)的字段。Stateflow 结构体的字段名称与定义该结构体的 Simulink.Bus 对象的元素名称一致。例如,此模型中的图包含一个输入结构体 (in)、一个输出结构体
对子结构体和字段进行索引
要对 Stateflow 结构体的子结构体和字段进行索引,请使用圆点表示法。名称的第一部分标识父对象。后续部分标识层次化路径上的各个子级。当父级为结构体时,其子级为单个字段或包含其他结构体(也称为子结构体)的字段。Stateflow 结构体的字段名称与定义该结构体的 Simulink.Bus 对象的元素名称一致。
例如,此模型中的图包含一个输入结构体 (in)、一个输出结构体 (out) 和两个本地结构体(localbus 和 subbus)。
该图使用 Simulink.Bus 对象 BusObject 定义输入结构体 in、输出结构体 out 和本地结构体 localbus。这些结构体有四个字段:sb、a、b 和 c。字段 sb 是从 Simulink.Bus 对象 SubBus 定义的子结构体。
该图使用 Simulink.Bus 对象 SubBus 定义本地结构体 subbus。此结构体有一个名为 ele 的字段。

此列表说明 Stateflow 图解析圆点表示法中的符号以对这些结构体的字段进行索引的方法:
in.c - 输入结构体 in 的字段 c。
out.sb - 输出结构体 out 的子结构体 sb。
in.a(1) - 输入结构体 in 的向量字段 a 的第一个值。
subbus.ele(2,2) - 本地结构体 subbus 的字段 ele 的第二行第二列的值。
in.sb.ele(3,4) - 子结构体 in.sb 的字段 ele 的第三行第四列中的值。
为结构体和字段赋值
您可以为任何 Stateflow 结构体、子结构体或作用域不为 Input 的结构体的字段赋值。
要将一个结构体赋给另一个结构体,请在基础工作区中基于同一 Simulink.Bus 对象定义这两个结构体。
要将一个结构体赋给另一个结构体的一个子结构体(或者反之),请基于同一 Simulink.Bus 对象定义该结构体和子结构体。
要将一个结构体的字段赋给另一个结构体的字段,这些字段必须具有相同的类型和大小。您可以基于不同 Simulink.Bus 对象定义 Stateflow 结构体。
以下列表基于此示例中的结构体设定说明有效和无效的结构体赋值:
in = localbus; - 无效。不能为输入结构体赋值。
out = localbus; - 有效。out 和 localbus 均基于相同的 Simulink.Bus 对象 BusObject 进行定义。
subbus = in; - 无效。结构体 subbus 和 in 基于不同 Simulink.Bus 对象进行定义。
subbus = in.sb; - 有效。结构体 subbus 和子结构体 in.sb 基于相同的 Simulink.Bus 对象 SubBus 进行定义。
in.sb = subbus; - 无效。您不能对输入结构体的子结构体进行写入操作。
out.sb = subbus; - 有效。子结构体 out.sb 和结构体 subbus 基于相同的 Simulink.Bus 对象 SubBus 进行定义。
in.c = out.c; - 无效。不能为输入结构体的字段赋值。
out.sb.ele = subbus.ele; - 有效。字段 out.sb.ele 与字段 subbus.ele 具有相同的类型和大小(int8 类型的 3×3 矩阵)。
localbus.a(1) = in.c; - 有效。值 localbus.a(1) 与字段 in.c 具有相同的类型和大小(double 类型的标量)。
例如,在状态 A 的 entry 动作中,Stateflow 图调用函数 abc2sb 和 sb2abc,并将结果存储在本地结构体 localbus 和 subbus 中。然后,该图将本地结构体 out 和 localbus 的值组合起来,写入输出结构体 subbus。

图形函数 abc2sb 接受 BusObject 类型的结构体,并返回 SubBus 类型的结构体。该函数将来自其输入的字段 a、b 和 c 的值组合在一起,并重排入一个 int8 类型的 3×3 矩阵中。然后,此函数将此矩阵存储为输出结构体的字段 ele。

MATLAB® 函数 sb2abc 接受 SubBus 类型的结构体,并返回 BusObject 类型的结构体。该函数将来自其输入的字段 ele 的值分解为三个组成部分:一个向量、一个 3×2 矩阵和一个标量。该函数将这些组成部分存储在一个本地 MATLAB Y 中,后者与 Simulink.Bus 对象 BusObject 具有相同的结构体。然后,该函数将 MATLAB struct Y 的值赋给输出结构体 y。
function y = sb2abc(u)
% extract data from input structure
E = int8(magic(3));
A = double(u.ele(1:2,1));
B = uint8(u.ele(:,2:3));
C = double(u.ele(3,1));
% create local structure
X = struct('ele',E);
Y = struct('sb',X,'a',A,'b',B,'c',C);
% assign value to output structure
y = Y;
end
运行仿真
当您对该示例进行仿真时,Stateflow 图使用输入总线的字段 sb 的值来填充输出总线的字段 a、b、c。该图还使用输入总线的字段 a、b、c 的值来填充输出总线的字段 sb。

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐



所有评论(0)