2016-06-07 8 views
2

Ich muss einen Code parallelisieren, um Zeit zu sparen. Ich habe eine Schleife intern zu einer anderen Schleife, und ich möchte die externe parallelisieren (weil ich denke, dass es so der Code schneller ist). Mein Code sieht wie folgt aus:Zwei-Schleifen-Fehler mit Parfor in der externen für

A = rand(1000,1); 
B = rand(1000,1); 
Biggers = zeros(1000,1000); 
parfor i = 1:size(A,1) 
    for j= 1:1:size(B,1) 
     if B(i,1) > A(j,1) 
      Biggers(i,j) = A(j,1); 
     end 
    end 
end 

aber wenn ich es auf diese Weise laufen bekomme ich den Fehler:

Error: The variable Biggers in a parfor cannot be classified. 
See Parallel for Loops in MATLAB, "Overview". 

diese Bedingung tritt nicht auf, wenn ich stattdessen die interne Schleife dh parallelisieren, wenn Sie den Code entwerfen wie:

A = rand(1000,1); 
B = rand(1000,1); 
Biggers = zeros(1000,1000); 
for i = 1:size(A,1) 
    parfor j= 1:1:size(B,1) 
     if B(i,1) > A(j,1) 
      Biggers(i,j) = A(j,1); 
     end 
    end 
end 

verstehe ich nicht, warum im ersten Fall Biggers keine geschnittenen Variable betrachtet wird, da jeder Arbeiter auf einer Linie meiner Variable nur konzentrieren sollte.

Wie kann ich das Problem lösen?

Antwort

3

Genau, warum es nicht mit der äußeren Schleife funktioniert, bin ich mir nicht sicher. MATLAB hat sehr strenge Vorschriften darüber, was und was nicht in die parfor Schleife fallen kann, die nicht immer kristallklar ist.

Die „einfache“ Lösung wäre, alles wickeln Sie innerhalb Ihre parfor Schleife in eine Funktion haben, dann parfor isst plötzlich alles. dh

function Biggers = parforfunc(A,B,ii) 
for jj= 1:size(B,1) 
    if B(ii,1) > A(jj,1) 
     Biggers(ii,jj) = A(jj,1); 
    end 
end 
end 

speichern, die als parforfunc.m und führen Sie Ihr Skript mit

A = rand(1000,1); 
B = rand(1000,1); 
Biggers = zeros(size(B,1),size(A,1)); 
parfor ii = 1:size(A,1) 
    Biggers = parforfunc(A,B,ii); 
end 
3

@ Adriaan Antwort das Problem ordentlich löst - aber wenn Sie neugierig sind, ist das Problem hier ist die „Nicht-Konstante“ Grenzen der inneren for Schleife. Sie und ich können klar sehen, dass die Grenzen der inneren Schleife in der Praxis konstant sind, aber die Regeln von MATLAB für parfor erfordern, dass die Grenzen irgendeiner inneren Schleife "Broadcast" -Variablen sind. Also, die fix ist trivial - Winde die innere Schleife Grenzen Berechnung aus der parfor Schleife, etwa so:

A = rand(1000,1); 
B = rand(1000,1); 
Biggers = zeros(1000,1000); 
n = size(B,1); 
parfor i = 1:size(A,1) 
    for j= 1:n 
     if B(i,1) > A(j,1) 
      Biggers(i,j) = A(j,1); 
     end 
    end 
end 

Dieser Fall ist in the doc beschrieben.

Verwandte Themen