2017-07-25 3 views
0

Ich habe folgende MATLAB-Code, dass ich es laufen soll durch parfor mit:MATLAB: parfor Fehler

max = -1; 
for i = 1:10 
    for j = (i+1):10 
     X = my_function(i, j); 
     if (X > max) 
      max = X; 
     end 
    end 
end 
disp(max) 

Ich möchte für die erste ändern parfor. Ich habe ein paar Tutorials und die Dokumentation gelesen, aber ich weiß nicht, wie ich das gleiche Ergebnis für max erreichen kann, indem ich Parfor benutze.

Ich weiß, dass es ein Problem mit der Verwendung von i in for j = (i+1):10 gibt.

Ich würde jeden Vorschlag zu schätzen wissen.

+2

Sie dies nicht tun. Sie speichern alle 'X' Werte in einem Array und finden danach das' max'. Es ist auch eine sehr schlechte Idee, eine Variable genauso zu benennen wie eine eingebaute Funktion. Es macht die Verwendung der Funktion wieder ein bisschen Schmerz. – beaker

+0

Es kann eine gute Idee sein, Ihre Fehler-/Warnmeldungen zu verwenden, um bessere Antworten und eine wiederverwendbare Frage zu erhalten. – m7913d

Antwort

2

Sie can not use parfor for dependent iterations, also in Ihrem Fall max ist eine abhängige (gemeinsam) variabel zwischen den Schleifendurchläufe:

Sie keine parfor-Schleife, wenn eine Iteration in der Schleife hängt von den Ergebnissen anderer nutzen können Iterationen. Jede Iteration muss unabhängig von allen anderen sein.

Dies wird auch in der angezeigten Warnmeldung reflektiert:

Achtung: Die temporäre Variable max am der parfor Schleife jeder Iteration Anfang gelöscht wird. Jeder ihm zugewiesene Wert vor die Schleife wird verloren gehen. Wenn max verwendet wird, bevor es in der Parfor-Schleife zugewiesen wird, tritt ein Laufzeitfehler auf. Siehe Parallel für Schleifen in MATLAB, "Temporäre Variablen".

MATLAB implementiert one exception to this rule, d.h. Reduction Variables:

Die Ausnahme von dieser Regel ist Werte in einer Schleife Reduction Variables Verwendung zu akkumulieren.

So können Sie Ihren Code neu schreiben Reduzierung Variablen zu verwenden:

maxX = -1; 
for i = 1:10 
    for j = (i+1):10 
     maxX = max(maxX, my_function(i, j)); 
    end 
end 
disp(maxX) 
Verwandte Themen