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

它工作正常,但我有一个问题。我的函数generate_data会生成唯一数据(即 0、1、2、3、4 ...),但实际上有时我会两次给出相同的值(我给出 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的两次迭代不会返回相同的值PARFOR。不幸的是,您不能直接在PARFOR循环中执行此操作,因为不允许通信。您的选择基本上是:要么调用generate_dataMATLAB 客户端;要么调用 MATLAB 客户端;或运行两个PARFOR循环,可能是这样的:

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. 我必须记住,一个数据集只能访问一个id. 它有效,但不能解决我的问题。我会id像第一篇文章一样消除参数并使用内部计数器。

于 2013-01-25T14:23:52.263 回答