You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 08:54:18