parfor中的Matlab sim命令

xoshrz7s  于 2022-11-30  发布在  Matlab
关注(0)|答案(1)|浏览(293)

我想在parfor循环中使用不同的数据在多个内核上运行Simulink模型。但是,当我使用parfor时,我无法获得sim结果,而当我仅使用for循环时,我可以获得这些结果。
它简单地从workspace1得到[t,u],考虑一个传递函数n{1}/d{1}然后计算出EqFracIntworkspace2
代码中有问题的部分是

...
parfor ieq=1:1
    assignin('base','t',t);
    assignin('base','u',u);
    assignin('base','n',n);
    assignin('base','d',d);
    assignin('base','T_end',T_end);
    [simout] = sim('RespSpecFrac', [0 T_end], simset('ReturnWorkspaceOutputs','on'));
    PGRs = simout.get('EqFracInt');
end

我无法得到PGRs的值。你能给我解释一下这个错误吗?

cmssoen2

cmssoen21#

你不能得到PGRs值的原因是它是一个临时变量。因为在parfor循环中,每次迭代都是独立的,任何在循环中直接赋值的没有索引的变量都只在那个特定的迭代中使用并被销毁。为了得到所需的值,你需要将PGRs转换为分片变量(通过索引)或在reduction变量中(例如,通过连接)。尝试按照以下示例之一修改循环的最后一行:

PGRs(ieq, :) = simout.get('EqFracInt');   % sliced variable

PGRs = [PGRs; simout.get('EqFracInt')];   % reduction variable

当然,具体的实现将取决于预期输出EqFracInt的形式。你可以在文档中看到更多关于parfor循环中变量类型的信息。

相关问题