如何在Matlab中修复parfor函数的预分配矩阵?

时间:2015-12-14 10:25:31

标签: matlab parallel-processing parfor

我想在matlab中麻痹我的forloop。我使用parfor函数,但是我得到错误,因为我在循环中使用变量的方式。有人会帮我解决这个问题。我是matlab的新手。 这是我尝试的一部分。

以下是问题部分的一部分:

CV_err=zeros(length(gamma), (Num_Tasks + 1));

parfor k=1:length(gamma)

#block of code

#
CV_err(k,1:Num_Tasks)= sum(In_Fold_Error)./size(In_Fold_Error,1);
CV_err(k,Lambda_location)= Lambda;
CV_err(k,(Num_Tasks +2))= sum(CV_err(k,1:Num_Tasks))/Num_Tasks;
end

错误:由于使用了CV_err,parfor循环无法运行。 CV_err以不同的方式编入索引,可能导致依赖

似乎有效的指数在parfor中受到限制。

2 个答案:

答案 0 :(得分:2)

当你的变量被切片时,你只访问第k次迭代中的第k行,代码分析器不理解它。给matlab一些帮助,首先将所有数据放入一个向量中,然后一次性写入切片变量。

CV_err=zeros(length(gamma), (Num_Tasks + 2));
parfor k=1:length(gamma)

%block of code

%
  temp=zeros(1,(Num_Tasks + 2));
  temp(1,1:Num_Tasks)= sum(In_Fold_Error)./size(In_Fold_Error,1);
  temp(1,Lambda_location)= Lambda;
  temp(1,(Num_Tasks +2))= sum(temp(1,1:Num_Tasks))/Num_Tasks;
  CV_err(k,:)=temp;
end

该限制在文档中解释:

  

索引形式。在切片变量的索引列表中,这些索引之一的形式为i,i + k,ik,k + i或ki,其中i是循环变量,k是常数或简单(非索引)广播变量;每个其他索引都是标量常量,简单的广播变量,嵌套的for循环索引,冒号或结尾。

Source

答案 1 :(得分:1)

要修复预分配,请不要预先分配。你只是告诉MATLAB它应该如何在工人之间分配工作; try/except不喜欢这样。

答案是:不要让循环更改常见变量,单独编写结果,增长单元数组而不是矩阵,即

parfor