1

我正在努力保存每次 PARFOR 迭代的输出,但直到现在都没有成功。我在网上搜索了很多,根据一些官方的 newgroup 回复,处理保存在 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 迭代(来自不同的工作人员)将用(仅)该工作人员的整个历史记录覆盖该记录,依此类推。

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

谢谢,

4

1 回答 1

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
于 2012-08-26T17:15:57.303 回答