我想在具有不同数据的许多内核上以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并行运行 . 你能告诉我这个错误以及如何解决吗?非常感谢你!
Answer to 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正确访问吗?
感谢致敬!
1 回答
我怀疑这是因为你的数据
data
只存在于主MATLAB的工作空间中,而不是存在于工作者的matlabpool
中的任何实例中 . 有关如何解决此问题的更多详细信息,请查看文档中的Workspace Access Issues,其中一些示例说明了这两种方法:[...]
EDIT
这是我在你的特定例子中会做的事情:
另一种选择是在模型工作区中包含
X
和Y
,以便模型是自包含的 .