MATLAB 无效的 Simulink 对象名称、parfor 和 load_system
MATLAB Invalid Simulink object name, parfor and load_system
我尝试使用 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)
然后我会得到以下错误:
Error using control_model (line 11)
Invalid Simulink object name: mymodel/mysystem
如果我再次 运行 它,我会得到同样的错误(尽管使用 for
而不是 parfor
解决了这个错误)。
但是如果我在 parfor
和 运行 之后放一个 load_system('mymodel');
一次,问题就解决了。即使我删除 load_system
命令,下一次也不会再显示错误。
我很想知道幕后发生了什么,以及为什么第一个 load_system
没有解决问题,即使我 运行 这个程序那么多次。而 parfor
中的那个即使在下次调用脚本时被删除也能解决问题?
我认为您需要在 worker 上加载模型(有关详细信息,请参阅文档中的 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
我尝试使用 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)
然后我会得到以下错误:
Error using control_model (line 11)
Invalid Simulink object name: mymodel/mysystem
如果我再次 运行 它,我会得到同样的错误(尽管使用 for
而不是 parfor
解决了这个错误)。
但是如果我在 parfor
和 运行 之后放一个 load_system('mymodel');
一次,问题就解决了。即使我删除 load_system
命令,下一次也不会再显示错误。
我很想知道幕后发生了什么,以及为什么第一个 load_system
没有解决问题,即使我 运行 这个程序那么多次。而 parfor
中的那个即使在下次调用脚本时被删除也能解决问题?
我认为您需要在 worker 上加载模型(有关详细信息,请参阅文档中的 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