Simulink技术问询:如何利用非连续枚举值作为数组索引
解决Simulink中非连续枚举作为数组索引的问题
问题描述
我在C#里极易实现的功能,到Simulink里却遇到了麻烦:我定义了一个非连续值的枚举,同时创建了一个大小和枚举元素数量一致的数组,希望用枚举值来索引数组的对应位置(比如用Example.value999读取数组的第4个元素),但Simulink现在会直接用枚举的底层数值999去索引数组,导致读取错误。
枚举定义如下:
classdef Example < Simulink.IntEnumType enumeration value1 (1) value2 (2) value13 (13) value999 (999) end end
Simulink中的配置:
- 数据存储内存
A的初始值设为uint16(zeros(1, length(enumeration('Example')))) - 使用带索引的数据存储读取模块,索引选项设为“索引向量(对话框)”,输入
A(Example.value999)
解决方案
方法1:修改枚举的底层值为连续索引(最简单)
如果允许修改枚举定义,直接把每个枚举项的底层值改成连续的1、2、3、4,这样就能直接对应数组的索引:
classdef Example < Simulink.IntEnumType enumeration value1 (1) value2 (2) value13 (3) value999 (4) end end
这种方法不需要改动Simulink模型的其他部分,直接就能实现预期的索引行为。
方法2:用Lookup Table模块做枚举值到索引的映射
如果不能修改枚举的底层值,可以在数据存储读取模块前加一个**Lookup Table(查找表)**模块:
- 查找表的输入是枚举的底层数值(比如1、2、13、999)
- 查找表的输出设置为对应的数组索引(1、2、3、4)
- 把查找表的输出作为数据存储读取模块的索引,即可正确读取数组对应位置。
方法3:用MATLAB Function模块处理索引转换
在Simulink中添加一个MATLAB Function模块,编写逻辑将枚举值映射为数组索引:
function idx = enumToIndex(enumVal) switch enumVal case Example.value1 idx = 1; case Example.value2 idx = 2; case Example.value13 idx = 3; case Example.value999 idx = 4; end end
将这个模块的输出连接到数据存储读取模块的索引端口,就能实现正确的索引转换。
方法4:利用枚举的元素顺序生成索引
如果枚举的元素顺序固定,可以用find函数获取枚举在列表中的位置:
function idx = enumToIndex(enumVal) allEnums = enumeration('Example'); idx = find(allEnums == enumVal); end
这种方法不需要硬编码每个枚举项的映射,适合枚举元素较多的场景。
内容的提问来源于stack exchange,提问作者Dana S
相关产品推荐
相关产品推荐

