1

我有这个代码:

Result = {};

% parfor k=1:1:3
for k=1:1:3

    % parfor j=1:1:10
    for j=1:1:10
        time = 1000*j;
        [A, B, C] = test (time,k,j);
        Result = cat(1,Result,{k,j,time,A,B,C});
    end

end

每次 'k' 迭代大约需要 20 分钟,因为函数 'test' 很重。如您所见,变量“结果”是一个单元矩阵,其中每一行包含函数的结果以及其他变量。

如果我将第一个“for循环”更改为“parfor”,结果首先是一个警告(警告:临时变量 Result 将在 parfor 循环的每次迭代开始时被清除),最后是一个错误(对已清除变量的引用结果)。

作为附加数据,两个循环可以并行运行,因为“测试”功能是独立的。问题是存储结果。

你会怎么做才能解决这个问题?

4

2 回答 2

2

并行运行任务时,每个工作人员都有自己的工作区。因此,每个工人必须在结果矩阵中有自己的单元格。也就是说,Result必须预先分配,并且您应该一次分配给特定的行。
例如:

Result = cell(3,10,6);

for k=1:3
    parfor j=1:10
        time = 1000*j;
        [A, B, C] = test(time,k,j);
        Result(k,j,:) = {k,j,time,A,B,C};
    end
end  

请注意,任何一个 for 循环都可以更改为parfor

于 2014-06-28T18:02:31.233 回答
0

1) 要成功创建切片变量,请仅Result{k}在 parfor 循环内使用,k迭代器在哪里。如果您不喜欢嵌套元胞数组,请仔细查看此文档页面

2)如果你想嵌套 parfor 循环(将一个循环放入另一个循环),线性化循环:如何嵌套多个 parfor 循环

于 2014-06-28T17:53:24.717 回答