如何仅用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。
- 第一个Constant模块输出
- SW1生成单元
使用1个输出ones(1,16)的Constant模块搭配1个双输入Sum模块:- Sum模块设置为
+-运算模式,全1向量接入正输入端,SW2信号接入负输入端 - Sum模块输出即为SW1:最大5个值对应位置为0,其余位置为1。
- Sum模块设置为
若使用定点仿真配置,只需将上述Constant模块的数据类型设置为与输入信号匹配的定点类型即可,逻辑无需调整。
内容的提问来源于stack exchange,提问作者adnan ashraf
相关产品推荐
相关产品推荐

