1

各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として宣言すると、同じワーカーの呼び出し全体で変数が「persistent」になるが、PARFORループ全体では作成されないため、任意の時点で、保存できた最後のワーカーの履歴全体しか得られないことです。 ; (別のワーカーからの)次のPARFOR反復は、このレコードをそのワーカーの(のみ)履歴全体で上書きします。

すべてのワーカーの履歴を段階的に保存するにはどうすればよいですか?

ありがとうございました、

4

1 に答える 1

0

ループが終了してマトリックス全体を保存するまで待てないのには理由があると思います。

1つのアイデアは、次のようなものを使用して、各反復を他の反復から独立して保存することです。

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

次に、ファイルを1つずつロードし、値を1つのマトリックスに結合します。

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 に答える