1

現在、MATLAB の構造体で計算を行う parfor ループがあります。私のコードは投稿するには少し長いですが、次の例を使用してエミュレートできます。

a.test = [1 2 3];
result = [];

parfor i = 1:3
  c = a;
  c.test(2) = round( rand() );

  if c.test(2) == 1
     %# Store c in result
  end
end

disp(result.test) %# Should show [1 1 3]

a (およびその結果 c) は非常に大きな構造であるため、すべての反復を格納することはできません (メモリの制約のため)。

理想的には、parfor ループの前に初期化する変数に c を直接格納できるようにしたいと考えています。MATLAB のExample: Using a Custom Reduction Functionを見ると、特定の反復変数を格納できることがわかります (すべての反復を格納する必要はありません) が、その方法を完全には理解していません。関数が1つの出力変数しか定義していないのに、関数が2つの別々の出力変数を生成する方法に困惑しています。

これは非常に一般的な問題だと確信していますが、これまでのところ、有効な結果が得られた検索はありません。

どんな助けでも大歓迎です。

4

1 に答える 1

3

リンク先の例は、希望どおりではありません。ただし、「良好な」結果のみを保存することは可能です。簡単な例を次に示します。

A=zeros(0,2); %# initialize A with no rows, two columns
parfor i=1:6
   tmp = rand(1); %# create some result
   if tmp > 0.5 %# store only part of the results
      A = [A;[tmp,i]]; %# store also the iteration number, in case it matters
   end
end
>> A

A =

    0.6497    2.0000
    0.5052    4.0000
    0.9993    5.0000
于 2012-04-13T11:58:52.167 に答える