这是我的代码的简化版本。我想要获得的是result1.mat中包含的variable1-行向量。问题是解析-仅保存一个结果,即第10次迭代的最后一个结果。我该怎么做才能将所有结果保存在parfor循环内的一个向量中(在variable1中)?
parfor ii = 1:10
[variable1, variable2] = MyFunction(~,~,ii);
parsave('result.mat',variable1, variable2)
end
function parsave(filename, varargin)
narginchk(2, Inf);
nargoutchk(0, 0);
for I = 2:nargin
varname = genvarname(inputname(I));
eval([varname ' = varargin{' num2str(I-1) '};'])
if (I == 2)
save(filename, varname)
else
save(filename, varname, '-append')
end
end
在http://www.mathworks.com/matlabcentral/answers/179884-save-inside-parfor-loop-at-a-specific-iteration-step上找到了一种优雅的解决方案
parpool('local',10); % results will be distributed on 10 workers
output1=distributed.NaN(1,1e5); %pre-allocate
output2=distributed.NaN(1,1e5);
spmd
for i=drange(1:1e5)
[output1(ii), output2(ii)] = MyFunction(~,~,ii);
parsave(['output1', num2str(labindex)],...
getLocalPart(output1));
parsave(['output2', num2str(labindex)],...
getLocalPart(output2));
end
end
我使用了2倍的parsave函数,以防万一机器在模拟结束前关闭,将保存10个mat文件,并带有临时结果,以后需要将它们连接起来(对于output1和output2)
解析功能为:
function parsave(fname,data)
var_name=genvarname(inputname(2));
eval([var_name '=data'])
try
save(fname,var_name,'-append')
catch
save(fname,var_name)
end
% Written by Minjie Xu (<mailto:[email protected] [email protected]>)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句