我尝试使用parfor
命令在循环中运行模型。
所以我写了下面的代码:
% control_model.m
warning('off', 'Simulink:Engine:UsingDefaultMaxStepSize');
apool = gcp('nocreate');
if isempty(apool)
apool = parpool('local');
end
load_system('mymodel');
tic
parfor w=1:10
warning('off', 'Simulink:Engine:UsingDefaultMaxStepSize');
w_str=num2str(w);
set_param('mymodel/mysystem','sys', ['tf(',w_str,',[1 ',w_str,'])'] )
sim('mymodel',[],[])
drawnow
end
toc
close_system('mymodel',0);
% delete(poolobj)
然后我会收到以下错误:
使用control_model时出错(第11行)
无效的Simulink对象名称:mymodel / mysystem
如果我再次运行它,我会收到同样的错误(尽管使用for
代替parfor
可以解决此错误。)
但是,如果我在load_system('mymodel');
之后放置parfor
并运行一次,问题就解决了。即使我删除load_system
命令,错误也不再显示在下一次。
我很想知道幕后发生了什么,以及为什么即使我多次运行程序,第一个load_system
也无法解决问题。 parfor
中的那个即使在下次调用脚本时删除了问题也能解决问题吗?
答案 0 :(得分:1)
我认为您需要在工作人员上加载模型(有关详细信息,请参阅文档中的sim in parfor with Normal Mode),因此您的load_system
必须位于parfor
循环中:
tic
parfor w=1:10
load_system('mymodel');
warning('off', 'Simulink:Engine:UsingDefaultMaxStepSize');
w_str=num2str(w);
set_param('mymodel/mysystem','sys', ['tf(',w_str,',[1 ',w_str,'])'] )
sim('mymodel',[],[])
drawnow
end
toc