如何保存parfor循环的单个迭代

时间:2012-08-26 16:53:40

标签: matlab parallel-processing

我很难保存每个PARFOR迭代的输出,但直到现在还没有成功。我在网上搜索了很多,根据一些官方的新组回复,处理PARFOR中保存的正确方法(即解决“透明度”问题)是以下列方式使用外部函数(基本示例) :

parfor i=1:120
  display(i);
  [LL ll] = eig(rand(1000,1000));
  record(:,i) = diag(ll);
  samplesave('save.mat',record(:,i),i);
end

一起
function samplesave(fname, data,i)
   persistent st;
   store(:,i)=data;
   save(fname);
end

问题是将“st”声明为PERSISTENT会使变量“持久”跨越同一个工作者的调用,而不是跨越PARFOR循环,以便任何给定的点,你只有最后一个设法保存的工人的整个历史;下一个PARFOR迭代(来自不同的工作者)将用(仅)该工作者的整个历史记录覆盖此记录,依此类推。

如何逐步保存所有工人的历史记录?

谢谢,

1 个答案:

答案 0 :(得分:0)

我认为有一个原因让你不能等到循环终止后才能保存整个矩阵。

一个想法是使用以下内容保存每个迭代独立于其他迭代:

baseFile = ('part_%03d.mat');
parfor i=1:120
  display(i);
  [LL ll] = eig(rand(1000,1000));
  singleRecord = diag(ll);
  record(:,i) = singleRecord;
  save(sprintf(baseFile, i), 'singleRecord');
end

然后逐个加载文件并将值组合成一个矩阵。

mat = [];
baseFile = ('part_%03d.mat');
for i = 1:120
  d = load(sprintf(baseFile, i));
  mat(:,i) = d.singleRecord;
end