Я пытаюсь распараллелить 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)
В 'parfor' каждая итерация должна быть независимой друг от друга. Я думаю, что код можно переписать, чтобы отразить это. Я думаю, что теперь значение переменной index является, вероятно, вне пределов для 'p_t1', поэтому вы получаете эту ошибку. Однако, не запуская код, я не могу быть уверен. Хорошо, после изучения большего, я вижу, что максимальное значение в 'L' может быть 7, что больше, чем длина' p_t1', что равно 6. –
Я думаю, что L {j} является вектором (что-то вроде список?) с разным размером для каждого j, и это вызывает проблему. Это будет причина? Как я могу это решить? – Haris
Даже если 'L {j}' был бы вектором, я не понимаю, почему это вызовет проблему, потому что 'p_t0 (j)/con_size (j)' все еще является скаляром (одним числом). Вы должны подумать, почему запись в 'L {j}' больше длины 'p_t1'. –