Matlab 在parfor循环中使用Parsave-仅保存我的上一个变量结果
这是我的代码的简化版本。我想要得到的是result.mat中包含的可变1行向量。问题是parsave-只保存一个结果,即第10次迭代的最后一个结果。如何将所有结果保存在parfor循环内的一个向量(variable1)中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
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>)