Sie sehen den Fehler, weil Sie parfor
in Ihrem Code missbrauchen. Sie haben die relevante Dokumentation nicht genug gelesen, und Sie scheinen zu glauben, dass parfor
magischer Feenstaub ist, der Ihre Berechnung schneller macht, unabhängig von der Berechnung. Nun, ich habe schlechte Nachrichten.
Werfen wir einen genaueren Blick auf Ihr Beispiel nehmen:
a = zeros(3,1);
% usual for
disp('before for')
for t=1:2
ind = randsample(3,2);
a = pf(a,ind);
disp(a); % add printing line
end
% parfor
disp('before parfor')
parfor t=1:2
ind = randsample(3,2);
a = pf(a,ind);
disp(a); % add printing line
end
Der Ausgang:
before for
2
2
0
2
4
2
before parfor
Error: The variable a is perhaps intended as a reduction variable, but is actually an uninitialized temporary.
See Parallel for Loops in MATLAB, "Temporary Variables Intended as Reduction Variables".
Wie Sie, im letzteren Fall sehen können, gibt es keine Abzüge innerhalb des parfor
, so es doesn Ich werde nicht einmal weglaufen. Siehe auch die Warnung über den Typ der Variablen. Die Variable a
wird von der Ausführungs-Engine falsch erkannt, weil das, was Sie damit machen, keinen Sinn ergibt.
Was also zu tun? Sie müssen Ihr Problem so formulieren, dass es mit parfor
kompatibel ist. Dies hängt leider davon ab, was genau Sie mit Ihrer Matrix machen. Für Ihren speziellen Fall von Zufallselementen erhöht wird, schlage ich vor, dass Sie die einzelnen Schritte separat in der Schleife zu sammeln, und summieren sie danach auf:
a = zeros(3,1); % only needed for size; assumed that it exists already
numiters = 2;
increments = zeros([size(a), numiters]); % compatible with a proper 2d array too
parfor t=1:numiters
ind = randsample(3,2);
% create an auxiliary increment array so that we can use a full slice of 'increments'
new_contrib = zeros(size(a));
new_contrib(ind) = 2;
increments(:,t) = new_contrib;
disp(increments(:,t)); % add printing line
end
% collect increments along last axis
a = sum(increments,ndims(increments));
disp(a)
Ausgang:
2
0
2
2
2
0
4
2
2
Hinweis das Fehlen von Warnungen und der Vorhandensein einer sinnvollen Antwort. Refactoring der Schleife auf diese Weise transparently signalisiert MATLAB was die Variablen tun, und dass increments
wird durch unabhängige Iterationen der parfor
Schleife gefüllt. Diese ist die Art und Weise, in der parfor
"Berechnungen beschleunigen" kann, eine sehr spezifische und kontrollierte Art, die Einschränkungen in der Logistik innerhalb der Schleife impliziert.
Was erwarten Sie von der "Parfor" mit Ihrer Schleife? Und bitte antworten Sie nicht "beschleunigen". –
Hallo, das ist der vereinfachte Code. Der echte Code hat eine große Matrix und ich möchte parfor verwenden, um ihn zu beschleunigen. –
OK, ich habe überprüft und ich kann Ihren Fehler reproduzieren (löschte meinen vorherigen Kommentar). Das Problem ist wahrscheinlich, dass die Parfor in diesem Zusammenhang bedeutungslos ist. Verstehst du, was Parfor tut? –