Return values in a parfor loop
8 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
Wave
am 14 Mai 2020
Bearbeitet: Benjamin Hezrony
am 22 Feb. 2024
Heyhey,
at the moment my source code looks like this
ParForQueue = parallel.pool.DataQueue;
afterEach(ParForQueue,@AddStruct);
parfor m = 1:Anzahl
...
send(ParForQueue, Satz)
end
...
function [] = AddStruct(Satz)
global TabellenRueckgabe
...
end
My question is: how is it possible to avoid the global variable. I want to use the function like this instead of using global
function [TabellenRueckgabe] = AddStruct(Satz, TabellenRueckgabe)
TabellenRueckgabe(x) = Satz;
...
end
0 Kommentare
Akzeptierte Antwort
Edric Ellis
am 15 Mai 2020
Fundamentally, you need to "bind" a value in to the function that gets invoked by afterEach. The simplest way to do this is to use a nested function. Here's an example: in this case, the result vector has elements assigned when data queue messages are received:
function result = doStuff
q = parallel.pool.DataQueue;
% Pre-allocate the return value for the function
result = NaN(1, 20);
% This nested function modifies entries of 'result'
function nAccumulate(msg)
idx = msg(1);
val = msg(2);
result(idx) = val;
end
% Hook up our DataQueue to the nested function. The nested function
% handle can see and modify 'result'.
afterEach(q, @nAccumulate);
% Run the parfor loop, sending back updates.
parfor ii = 1:10
idx = randi(20);
val = rand();
% This will cause the idx'th element of 'result' to get the value
% 'val'.
send(q, [idx, val]);
end
end
2 Kommentare
Benjamin Hezrony
am 22 Feb. 2024
Bearbeitet: Benjamin Hezrony
am 22 Feb. 2024
Is there a way to return “result” without using a nested function?
Weitere Antworten (0)
Siehe auch
Kategorien
Mehr zu Background Processing finden Sie in Help Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!