2016-04-24 25 views
0

Ich versuche, den PageRank mit Matlab Parfor Befehl parallelisieren, wie unten gezeigt.Fehler bei der Verwendung von Matlab Parfor

jedoch die Linie, die durch ** ** gekennzeichnet ist und auch weiter unten geschrieben:

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

verursacht diesen Fehler:

„Nicht definierte Funktion‚p_t1‘für die Eingabe Argumente des Typs ' int32 '. "

Wenn ich es auskommentieren, funktioniert der Code. Wenn ich das Parfor durch ein normales ersetzen, funktioniert es wieder. Was ist das Problem?

Dank

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

In 'parfor' sollte jede Iteration unabhängig voneinander sein. Ich denke du Code kann umgeschrieben werden, um das zu reflektieren. Ich denke, jetzt 'Index' Variable Wert ist wahrscheinlich außerhalb der Grenzen für 'p_t1', daher erhalten Sie diesen Fehler. Ohne den Code auszuführen, kann ich jedoch nicht sicher sein. Ok, nachdem ich mehr untersucht habe, kann ich sehen, dass der Maximalwert in 'L' 7 sein kann, was mehr ist als die Länge von' p_t1', also 6. –

+0

Ich denke, dass L {j} ein Vektor ist eine Liste?) mit unterschiedlicher Größe für jedes j und das verursacht das Problem. Wäre das der Grund? Wie kann ich es lösen? – Haris

+0

Selbst wenn 'L {j}' ein Vektor wäre, sehe ich nicht, warum es ein Problem verursachen würde, weil 'p_t0 (j)/con_size (j)' immer noch ein Skalar (eine einzelne Zahl) ist. Sie sollten sich überlegen, warum ein Eintrag in 'L {j}' größer ist als die Länge von 'p_t1'. –

Antwort

0

Jede Variable in parfor Schleife classified in eine von mehreren Kategorien sein muss. Ihre p_t1 Variable kann nicht als eine klassifiziert werden. Es scheint, dass Sie versuchen, das Ergebnis in dieser Variable über mehrere Iterationen hinweg zu akkumulieren, was mit reduction variables erledigt werden kann. Dies ist nur möglich, wenn das Ergebnis nicht von der Reihenfolge der Iterationen abhängt (was in Ihrem Beispiel der Fall zu sein scheint), aber wie Sie der Dokumentation entnehmen können, sind nur bestimmte Arten von Ausdrücken für Reduktionsvariablen erlaubt - meist einfach Zuordnungen. Insbesondere können Sie nicht in eine Reduktionsvariable indizieren - weder auf der linken noch auf der rechten Seite der Zuweisung.

Matlab sollte auch viele Warnungen und M-Lint (statischer Code Analyzer) Warnungen produzieren, um dieses Problem hervorzuheben.

Sie müssen Ihren Code neu schreiben, damit Matlab jede in parfor verwendete Variable eindeutig in eine der zulässigen Kategorien einstufen kann.