2012-04-13 20 views
1

現在、私はparforループをMATLABの構造体で計算しています。私のコードを投稿する少し長いですが、それは次の例使用してエミュレートすることができますので、すべての反復を格納、構造体変数をParforループで計算する - MATLAB

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] 

(その結果、C)非常に大きな構造体であるが(原因に私のために現実的ではありませんメモリの制約)。

理想的には、私はparforループの前に初期化する変数にまっすぐにcを格納できるようにしたいと思います。 MATLABのExample: Using a Custom Reduction Functionを見ると、ある反復変数を格納することが可能であることがわかりますが(1回の繰り返しを保存する必要はありません)、その方法を完全には理解していません。関数が2つの別個の出力変数(一見すると)をどのように生成するか、関数が1つの出力変数のみを定義する方法にはうんざりです。

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

ご協力いただければ幸いです。

+0

私はあなたがここに何を意味するかによって少し混乱している:あなたは、並列反復を行うだけ(おそらく他のタスクをキャンセルする)いくつかのテストに合格し、最初の結果を取るようにしたいですか?配列内の 'cummax'関数について言えば、1つの出力しかしません(2要素配列になります)。 – Dougal

+0

'cummax'関数に関しては、私は今それを見ています。最初はA(1)とB(1)を手続きとして無視しましたが、今は何をしているのか分かります。あなたは私には当てはまりませんが、あなたは書きました。他のタスクをキャンセルすることは重要ではありません。その結果を得ることが重要です。しかし、以下のJonasはこれを行う簡単な方法を示しています。 – rbhalla

答えて

2

あなたがリンクしている例は、あなたが望むものではありません。しかし、「良い」結果だけを保存することは可能です。ここでは簡単な例です:

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 
+0

ありがとう!私は自分がこのことを理解していないと思うのは恥ずかしいです。私が読んだところでは、配列の反復スロットに特定の反復結果を格納する必要があると仮定しました。この形式で結果を連結することは決して私には起こりませんでした。ありがとうございました! – rbhalla

+1

@rbOthreeこれはあなたがリンクしているもののように、実際にはカスタムではなくビルトインされたもののような、 "縮小方法"です。 (裏では、Matlabは結果を収集し、反復順序や終了した順序ではなく、任意の方法で連結します)。 – Dougal