Matlab 在parfor循环中使用Parsave-仅保存我的上一个变量结果

Matlab 在parfor循环中使用Parsave-仅保存我的上一个变量结果,matlab,parallel-processing,parfor,Matlab,Parallel Processing,Parfor,这是我的代码的简化版本。我想要得到的是result.mat中包含的可变1行向量。问题是parsave-只保存一个结果,即第10次迭代的最后一个结果。如何将所有结果保存在parfor循环内的一个向量(variable1)中 parfor ii = 1:10 [variable1, variable2] = MyFunction(~,~,ii); parsave('result.mat',variable1, variable2) end function parsave(f

这是我的代码的简化版本。我想要得到的是result.mat中包含的可变1行向量。问题是parsave-只保存一个结果,即第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

parsave
中,您有以下语句:

if (I == 2)
    save(filename, varname)
else
    save(filename, varname, '-append')
end
因此,在第一次运行
parsave
时,每次运行
parsave
,都会覆盖
filename

此外,您的代码对于竞争条件来说是一个巨大的风险:假设两个进程试图同时执行文件的“初始保存”——一个进程将覆盖另一个进程,或者抛出“无法访问文件”错误


您最好在parfor循环中保存到temp文件,然后使用聚合器函数将不同的保存组合成有用的内容,或者在每次运行循环时只保存到一个新目录中,而不是创建一个新文件

有一个优雅的解决方案

我已经使用了2次parsave函数,因此如果在模拟结束前机器关闭,将保存10个mat文件和临时结果,稍后需要连接这些结果(用于output1和output2)

parsave函数是:

  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:chokkyvista06@gmail.com chokkyvista06@gmail.com>)
函数parsave(fname,data)
var_name=genvarname(inputname(2));
eval([var_name'=数据']))
尝试
保存(fname,var_name,'-append')
抓住
保存(fname,var\u name)
结束
%徐敏杰著()

我添加了2个标签,以吸引那些善于使用Matlab并行处理的人的更多关注,希望你能接受!
  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:chokkyvista06@gmail.com chokkyvista06@gmail.com>)