Return values in a parfor loop
9 visualizaciones (últimos 30 días)
Mostrar comentarios más antiguos
Wave
el 14 de Mayo de 2020
Editada: Benjamin Hezrony
el 22 de Feb. de 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 comentarios
Respuesta aceptada
Edric Ellis
el 15 de Mayo de 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 comentarios
Benjamin Hezrony
el 22 de Feb. de 2024
Editada: Benjamin Hezrony
el 22 de Feb. de 2024
Is there a way to return “result” without using a nested function?
Más respuestas (0)
Ver también
Categorías
Más información sobre Parallel for-Loops (parfor) en Help Center y File Exchange.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!