Return values in a parfor loop

조회 수: 7 (최근 30일)
Wave
Wave 2020년 5월 14일
편집: Benjamin Hezrony 2024년 2월 22일
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

채택된 답변

Edric Ellis
Edric Ellis 2020년 5월 15일
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
Wave
Wave 2020년 5월 15일
Good idea. Thank you!
Benjamin Hezrony
Benjamin Hezrony 2024년 2월 22일
편집: Benjamin Hezrony 2024년 2월 22일
Is there a way to return “result” without using a nested function?

댓글을 달려면 로그인하십시오.

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 Background Processing에 대해 자세히 알아보기

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by