You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Simulink中From Workspace读取数组丢失首元素的无零添加解决方案咨询

哎,这个坑我之前也踩过!本质是Simulink对纯数值数组的时间映射默认行为在搞鬼——当你直接传入x = [1 2 3 4 5]时,Simulink默认会把数组元素对应到t=1、2、3、4、5这些时间点,而仿真起始时刻t=0没有对应数据,导致第一个输出直接从t=1的2开始,自然就丢了第一个元素1。

下面给你几个不用修改原数组的解决方案:

方案1:给From Workspace指定匹配的时间序列

双击From Workspace模块,在参数面板里:

  • 保持Data栏为x不变
  • 找到Time选项(默认是空数组[]),把它改成0:4(因为数组有5个元素,对应t=0、1、2、3、4这5个时间点)
  • 确保仿真的Start Time设为0Stop Time设为4

这样模块会把x的每个元素精准映射到对应的起始时间点,仿真时就能完整捕获所有值。

方案2:调整From Workspace的输出模式

  1. 打开From Workspace模块参数,把Output options从默认的Interpolate data改成Produce specified output only at simulation time hits
  2. 把仿真的Stop Time设置为length(x)-1(也就是4,对应5个采样时刻)
  3. 保持Sample time1(和时间步长对齐)

这个设置会强制模块只在指定的时间点输出数据,不会跳过起始时刻的第一个元素。

方案3:用Matlab Function模块主动捕获初始值

如果上面的设置还是有问题,可以在你的Matlab Function模块里加个初始值判断(适合需要自定义逻辑的场景):

function y = fcn(u)
%#codegen
persistent first_run
if isempty(first_run)
    % 首次运行时直接输出原数组的第一个元素
    y = x(1); 
    first_run = true;
else
    y = u;
end

不过这个方法需要确保工作区里的x是可访问的,不如前两个方案通用。

验证一下:按照上面任意一种方法设置后,重新运行仿真,simout就会完整输出[1 2 3 4 5]啦!

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

火山引擎 最新活动