使用matlab parfor时出错

时间:2016-04-24 00:37:21

标签: matlab parfor

我正在尝试使用matlab parfor命令并行化pagerank,如下所示。

然而,由** **标记的行也写在下面:

p_t1(L{j,i}) = p_t1(L{j,i}) +constant;

导致此错误:

“未定义函数'p_t1'用于'int32'类型的输入参数。”

当我评论它时,代码有效。当我用正常替换parfor时,它再次起作用。有什么问题?

由于

S='--------------------------------------------------';
n = 6;
index=1;
a = [2 6 3 4 4 5 6 1 1];
b = [1 1 2 2 3 3 3 4 6];
a = int32(a);
b=int32(b);
a=transpose(a);
b=transpose(b);
vec_len=length(a);
%parpool(2);

for i=1:vec_len
    G(1,i)=a(i);
    G(2,i)=b(i);
    con_size(i)=0;
end
%n=916428

for j = 1:vec_len
   from_idx=a(j);
   con_size(from_idx)=con_size(from_idx)+1;
   L{from_idx,con_size(from_idx)}=b(j); 
end
% Power method
max_error=100;
p = .85;
delta = (1-p)/n;
p_t1 = ones(n,1)/n;
p_t0 = zeros(n,1);
cnt = 0;
tic

while max_error > .0001
   p_t0 = p_t1;
   p_t1 = zeros(n,1);

   parfor j = 1:n
      constant=p_t0(j)/con_size(j);
      constant1=p_t0(j)/n;

      if con_size(j) == 0
         p_t1 = p_t1 + constant1;
      else
         for i=1:con_size(j)  
            **p_t1(L{j,i}) = p_t1(L{j,i}) +constant;**
         end
      end
   end
   p_t1;
   sum(p_t1);
   p_t1 = p*p_t1 + delta;
   cnt = cnt+1;
   max_error= max(abs(p_t1-p_t0));
   %disp(S); 
end
toc

%delete(gcp)

1 个答案:

答案 0 :(得分:0)

parfor循环中的每个变量必须classified为几个类别中的一个。您的p_t1变量不能归类为任何变量。您似乎尝试在多次迭代中累积此变量的结果,这可以使用reduction variables来完成。只有当结果不依赖于迭代次序(在您的示例中似乎是这种情况)时,这才有可能,但正如您从文档中看到的那样,只有某些类型的表达式允许用于简化变量 - 大多数只是简单分配。特别是,您无法索引到减少变量 - 既不在左侧,也不在分配的右侧。

Matlab也应该发出大量警告和M-Lint(静态代码分析器)警告来突出这个问题。

您需要重新编写代码,以便Matlab可以清楚地将parfor中使用的每个变量分类为一个允许的类别。