Return values in a parfor loop
10 views (last 30 days)
Show older comments
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 Comments
Accepted Answer
Edric Ellis
on 15 May 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 Comments
Benjamin Hezrony
on 22 Feb 2024
Edited: Benjamin Hezrony
on 22 Feb 2024
Is there a way to return “result” without using a nested function?
More Answers (0)
See Also
Categories
Find more on Parallel for-Loops (parfor) in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!