Use Objects and Handles in parfor-Loops - MATLAB & Simulink (original) (raw)
Main Content
Objects
When you run a parfor
-loop, you can send broadcast variables or sliced input variables from the client to workers, or send sliced output variables from workers back to the client. The save
andload
functions must be supported for each object that you send to or from workers. For more information, see Default Save and Load Process for Objects.
Assigning a value to the sliced property of an object or the sliced field of a structure is not supported in a parfor
-loop.
Invalid | Valid |
---|---|
s = struct; parfor i = 1:4 s.SomeField(i) = i; end | parfor i = 1:4 x(i) = i; end s = struct('SomeField',x); |
For more information about first-level indexing constraints, see Sliced Variables.
Handle Classes
You can send handle objects as inputs to the body of aparfor
-loop. However, any changes that you make to handle objects on the workers during loop iterations are not automatically propagated back to the client. That is, changes made inside the loop are not automatically reflected after the loop.
To make the client reflect the changes after the loop, explicitly assign the modified handle objects to output variables of the parfor
-loop. In the following example, maps
is a sliced input/output variable.
maps = {containers.Map(),containers.Map(),containers.Map()}; parfor ii = 1:numel(maps) mymap = maps{ii}; % input slice assigned to local copy for jj = 1:1000 mymap(num2str(jj)) = rand; end maps{ii} = mymap; % modified local copy assigned to output slice end
Sliced Variables Referencing Function Handles
You cannot directly call a function handle with the loop index as an input argument, because this variable cannot be distinguished from a sliced input variable. If you must call a function handle with the loop index variable as an argument, use feval.
The following example uses a function handle and afor
-loop.
B = @sin; for ii = 1:100 A(ii) = B(ii); end
A corresponding parfor
-loop does not allow B
to reference a function handle. As a workaround, usefeval
.
B = @sin; parfor ii = 1:100 A(ii) = feval(B,ii); end