2016-04-24 2 views
0

Я пытаюсь распараллелить pagerank, используя команду matlab parfor, как показано ниже.Ошибка использования matlab parfor

Однако линия, которая характеризуется ** ** и также написано ниже:

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) 
+0

В 'parfor' каждая итерация должна быть независимой друг от друга. Я думаю, что код можно переписать, чтобы отразить это. Я думаю, что теперь значение переменной index является, вероятно, вне пределов для 'p_t1', поэтому вы получаете эту ошибку. Однако, не запуская код, я не могу быть уверен. Хорошо, после изучения большего, я вижу, что максимальное значение в 'L' может быть 7, что больше, чем длина' p_t1', что равно 6. –

+0

Я думаю, что L {j} является вектором (что-то вроде список?) с разным размером для каждого j, и это вызывает проблему. Это будет причина? Как я могу это решить? – Haris

+0

Даже если 'L {j}' был бы вектором, я не понимаю, почему это вызовет проблему, потому что 'p_t0 (j)/con_size (j)' все еще является скаляром (одним числом). Вы должны подумать, почему запись в 'L {j}' больше длины 'p_t1'. –

ответ

0

Каждая переменная внутри parfor петли должны быть classified в одну из нескольких категорий. Ваша переменная p_t1 не может быть классифицирована как любая. Похоже, вы пытаетесь скопировать результат в эту переменную на нескольких итерациях, что можно сделать с помощью reduction variables. Это возможно только в том случае, если результат не зависит от порядка итераций (что, по-видимому, имеет место в вашем примере), но, как вы можете видеть из документации, допускаются только определенные типы выражений для переменных сокращения - в основном просто задания. В частности, вы не можете индексировать переменную уменьшения - ни с левой, ни с правой стороны задания.

Matlab должен также производить множество предупреждений и предупреждений M-Lint (статический анализатор кода), чтобы выделить эту проблему.

Вам необходимо переписать код, чтобы Matlab мог четко классифицировать каждую переменную, используемую внутри parfor, в одну из разрешенных категорий.

Смежные вопросы