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

如何仅用Simulink模块实现指定MATLAB函数解决仿真过慢问题

如何用Simulink内置模块替代MATLAB Function实现指定开关逻辑

问题描述

当前在MATLAB Function模块中实现如下逻辑时,仿真运行速度很慢,需要仅使用Simulink内置模块实现完全一致的功能:

function [SW1, SW2]= fcn(vall)

    SW1 = ones(1,16);
    SW2 = zeros(1,16);

    % 输入vall为1×16行向量
    [v, idx] = sort(vall,"descend")

    for i = 1:5
       SW1(1,idx(i)) = 0;
       SW2(1,idx(i)) = 1;
    end

end

该函数逻辑为:

  • 输入16元素行向量vall
  • 初始化SW1为1×16全1向量,SW2为1×16全0向量
  • 对vall做降序排序,得到排序后各元素在原数组中的索引
  • 将数值最大的5个元素对应位置的SW1置0、SW2置1

实现方案

以下方案全部使用Simulink标准库内置模块,无自定义代码,仿真执行效率远高于解释运行的MATLAB Function模块,逻辑与原代码100%一致:

  • 排序单元
    使用Sort模块(路径:Simulink / Math Operations),参数配置:
    • 排序方向选择Descending(降序)
    • 输出模式选择Index and sorted value(同时输出排序值、原数组索引)
    • 输入处理模式选择Elements as channels (sample based)适配1×16向量输入
      输入信号vall接入该模块后,直接输出原代码中sort函数返回的排序值向量、索引向量idx。
  • 前5位索引提取单元
    使用Selector模块(路径:Simulink / Signal Routing),参数配置:
    • 索引基数与Sort模块保持一致(默认1基索引即可)
    • 选择指定索引位置的元素,索引值设置为[1 2 3 4 5]
      将Sort模块输出的索引向量接入该模块,输出即为降序排序后前5个最大值在原输入数组中的位置索引。
  • SW2生成单元
    使用2个Constant模块搭配1个Assignment模块(路径:Simulink / Math Operations):
    • 第一个Constant模块输出zeros(1,16)作为初始全0向量,接入Assignment模块的原始数据端口
    • 第二个Constant模块输出ones(1,5)作为待写入值,接入Assignment模块的赋值数据端口
    • Selector模块输出的5个位置索引接入Assignment模块的索引端口,配置模块为1维向量赋值模式,输出即为SW2:最大5个值对应位置为1,其余位置为0。
  • SW1生成单元
    使用1个输出ones(1,16)的Constant模块搭配1个双输入Sum模块:
    • Sum模块设置为+-运算模式,全1向量接入正输入端,SW2信号接入负输入端
    • Sum模块输出即为SW1:最大5个值对应位置为0,其余位置为1。

若使用定点仿真配置,只需将上述Constant模块的数据类型设置为与输入信号匹配的定点类型即可,逻辑无需调整。

内容的提问来源于stack exchange,提问作者adnan ashraf

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 13:19:07