1

私はparforこの方法で並列にデータを処理しています:

iteration = 10;
result = zeros(1, iteration);

matlabpool open local 2
    parfor i = 1:iteration
        data = generate_data();
        result(i) = process_data(data);
    end
end
matlabpool close

問題なく動作しますが、問題が 1 つあります。私の関数generate_dataは一意のデータ (つまり、0、1、2、3、4 ...) を生成しますが、実際には、同じ値を 2 回与えることがあります (そして、0、1、1、2、3、4、4、5、 ...)。簡単に言えば、私の関数は次のようになります。

function data = generate_data()

persistent counter generated_data;

if(isempty(counter))
    counter = 1;
    generated_data = [0 1 2 3 4 5 6 7 8 9]; 
end

data = generated_data(counter);
counter = counter + 1;

どうすればこれを修正できますか?

4

2 に答える 2

1

私が正しく理解している場合は、ループgenerate_dataの2回の反復で同じ値が返されないようにする必要があります。残念ながら、通信が許可されていないため、ループ内でPARFORこれを直接行うことはできません。PARFORオプションは基本的に次のとおりgenerate_dataです。MATLABクライアントで呼び出す。または、PARFORおそらく次のように2つのループを実行します。

parfor ii = 1:iteration
  generated(ii) = generate_data();
end

% omit duplicated values - perhaps you might wish to generate
% some more here too...
generated = unique(generated);

parfor ii=1:numel(generated)
  result(ii) = process_data(generated(ii));
end
于 2013-01-25T10:06:15.153 に答える
0

私はこれを試しました:

function data = generate_data(id)

persistent generated_data;
if(isempty(generated_data))
    generated_data = [0 1 2 3 4 5 6 7 8 9]; 
end

data = generated_data(mod(id - 1, length(generated_data)) + 1);

各呼び出しで、を使用してオンデマンドでデータ セットを生成できますid。1 つのデータ セットに到達できるのは 1 つのid. それは機能しますが、私の問題は解決しません。最初の投稿のように、パラメーターを削除idして内部カウンターを使用します。

于 2013-01-25T14:23:52.263 に答える