我今天问了一个关于使用Matlab-Simulink进行并行计算的问题。由于我之前的问题有点混乱,代码中有很多东西并不真正属于这个问题。
我的问题是
我想在parfor-Loop中模拟某些东西,而我的Simulink-Simulation使用" From Workspace"阻止将工作空间中所需的数据集成到模拟中。由于某种原因,它不起作用。
我的代码如下所示:
load DemoData
path = pwd;
apool = gcp('nocreate');
if isempty(apool)
apool = parpool('local');
end
parfor k = 1 : 2
load_system(strcat(path,'\DemoMDL'))
set_param('DemoMDL/Mask', 'DataInput', 'DemoData')
SimOut(k) = sim('DemoMDL')
end
delete(apool);
我的模拟如下
DemoData-File 只是一个零(100,20)-Matrix。这是数据的一个例子。
现在,如果我在出现以下错误消息时模拟脚本:
错误
使用DemoScript时出错(第9行)
评估参数' DataInput'时出错在' DemoMDL / Mask'
引起:
Error using parallel_function>make_general_channel/channel_general (line 907) Error evaluating parameter 'DataInput' in 'DemoMDL/Mask' Error using parallel_function>make_general_channel/channel_general (line 907) Undefined function or variable 'DemoData'.
现在你知道为什么会这样吗?
奇怪的是,如果我尝试访问“演示数据”'在parfor-Loop里面它起作用。对于使用该代码的示例:
load DemoData
path = pwd;
apool = gcp('nocreate');
if isempty(apool)
apool = parpool('local');
end
parfor k = 1 : 2
load_system(strcat(path,'\DemoMDL'))
set_param('DemoMDL/Mask', 'DataInput', 'DemoData')
fprintf(num2str(DemoData))
end
delete(apool);
在没有模拟和显示数据的情况下输出我的输出
'>>' DemoScript 00000000000000000 .....
非常感谢。这是原始问题,有更多(不必要的)细节:
答案 0 :(得分:3)
我怀疑问题在于,当MATLAB预处理parfor
循环以确定需要传递给工作人员的变量时,它不知道DemoData
是什么。在您的第一个示例中,它只是一个字符串,因此不会发送任何数据。在你的第二个例子中,它明确知道变量,因此确实传递了它。
您可以尝试使用模型工作区,也可以只插入行
DemoData = DemoData;
在parfor
循环代码中。
答案 1 :(得分:2)
您的错误是因为工作人员无法访问客户端工作区中的DemoData。
使用Simulink运行并行仿真时,如果将数据移动到模型工作区,则可以更轻松地管理工作区中的数据。然后每个工作人员都可以从其模型工作区访问此数据。您可以加载MAT文件或编写MATLAB代码来初始化模型工作区中的数据。您可以使用Simulink模型菜单View-> Model Explorer-> Model Workspace访问模型工作区。
另请参阅http://www.mathworks.com/help/simulink/ug/running-parallel-simulations.html上的文档,其中涉及"解决工作空间访问问题"。