我想在具有不同数据的许多核心上以parfor循环运行复杂的Simulink模型。 但是,我还没有成功,所以我创建了一个简单的模型,并尝试与相同的数据并行运行。
模型看起来像这样,添加了两个信号: 使用代码:
function Result = Add (X, Y)
Result = X + Y;
运行模型的脚本如下:
if matlabpool('size') == 0
matlabpool('open',4);
end
parfor i = 1:4
data=ones(1,20);
X=timeseries(data);
Y=timeseries(data);
output = sim('model_test','StopTime','5');
Result = output.get('Res');
end
但是,会发生以下错误:
我不明白为什么变量不存在。我知道并行计算在变量访问方面总是至关重要的,但我还没有成功使用simulink并行运行。你能告诉我这个错误以及如何解决吗? 非常感谢你!
答案am304 :谢谢,答案帮助了我,我现在知道如何在parfor循环中使用set_param更改常量,我理解为什么它不适用于时间序列。 然而对于时间序列,我仍然在苦苦挣扎。 我尝试了几个版本,也就是这个版本:
if matlabpool('size') == 0
matlabpool('open',4);
end
data=ones(1,20);
X=timeseries(data);
Ybase=timeseries(data);
parfor i = 1:4
Y = evalin('base', 'Ybase');
output = sim('model_test','StopTime','5');
Result{i} = output.get('Res');
end
变量Ybase存在于工作空间中,但会发生以下错误:
如您所见,变量Ybase存在于基础工作区中。你知道如何使用evalin或assignin正确访问吗?
谢谢和问候!
答案 0 :(得分:2)
我怀疑这是因为您的数据data
仅存在于主MATLAB的工作空间中,而不存在于matlabpool
对工作人员启动的任何实例中。有关如何解决此问题的更多详细信息,请查看文档中的Workspace Access Issues,并举例说明这两种方法:
然而,MATLAB工作者无法访问工作区 MATLAB客户端会话所在的模型及其相关工作空间 变量已加载。因此,如果您加载模型并定义它 parfor循环之外和之前的相关工作空间变量, 然后既没有加载模型,也没有工作区变量 在parfor迭代所在的MATLAB工作器会话中定义 执行。定义模型参数时通常就是这种情况 或客户端会话的基本工作空间中的外部输入。这些 场景构成了工作区访问问题。
[...]
解决工作区访问问题
当Simulink模型在MATLAB客户端会话中加载到内存中时,它只是可见的 可在MATLAB会话中访问;它无法在内存中访问 MATLAB工作者会话。同样,工作区变量 与在MATLAB客户端会话中定义的模型相关联 (例如参数和外部输入)不是自动的 在工人会议中可用。因此,你必须确保 加载模型并在中引用工作空间变量 model使用以下内容在MATLAB工作程序会话中定义 两种方法。
- 在
parfor
循环中,使用sim
命令加载模型并设置随每次迭代而变化的参数。 (备选: 加载模型,然后使用g(s)et_param命令设置parfor
循环中的参数)- 在
parfor
循环中,使用MATLABevalin
和assignin
命令将数据值分配给变量。或者,你可以 通过定义工作空间变量来简化它们的管理 模型工作区。然后这些变量将自动生成 将模型加载到工作程序会话时加载。那里 然而,这种方法的局限性。例如,你不能 在模型工作区中具有可调参数。详细说明 有关模型工作区的讨论,请参阅Model Workspaces。
修改强>
以下是我在你的特定例子中会做的事情:
if matlabpool('size') == 0
matlabpool('open',4);
end
data=ones(1,20);
X=timeseries(data);
Y=timeseries(data);
parfor i = 1:4
assignin('base','Y',Y);
output = sim('model_test','StopTime','5');
Result{i} = output.get('Res');
end
另一种选择是在模型工作区中包含X
和Y
,以便模型是自包含的。