Using parfor with a 3d array

I am trying to update a 3d array within a parfor loop. The actual code is too messy to reproduce here but the snippet of code below conveys what I am trying to do (but unable to).
a = zeros(5,5,10):
parfor t = 1:ntimes;
temp = randn(5,5); % In my actual code, this is some meaningful quantity that depends on the loop variable 't'
for k = 1:10;
a(:,:,k) = a(:,:,k) + randn(5,5);
end
end
I get an error saying matlab is unable to classiy the variable 'a'.
Is there a way I can fix this?
Thanks!

Answers (1)

Matt J
Matt J on 3 Feb 2021
A variable in a parfor loop must belong to one of 5 categories. I cannot tell from your simplified example which category a is supposed to belong to (and neither can parfor), but the table here should help you decide:

6 Comments

Thanks for the reply. I did look at that link but it was not clear why 'a' in my example is not classified.
I was able to get around this error as follows:
%<same code as before>
for k = 1:10;
temp(:,:,k) = randn(5,5);
end
a = a + temp;
Matt J
Matt J on 3 Feb 2021
Edited: Matt J on 3 Feb 2021
Thanks for the reply. I did look at that link but it was not clear why 'a' in my example is not classified.
If not, then which class do you think it should belong to?
I would have thought it should be a reduction variable as it is accumulating values irrespective of the parfor loop order.
I also found this statement in the matlab docs:
"MATLAB Coder does not allow reduction variables to be read anywhere in the parfor-loop except in reduction statements"
I wonder if the above also means a reduction variable cannot appear inside a nested for loop (itself inside a parfor loop).
You cannot index or subscript a reduction variable.
Ah, got it. Thanks again!

Sign in to comment.

Categories

Find more on Loops and Conditional Statements in Help Center and File Exchange

Products

Release

R2019a

Asked:

on 3 Feb 2021

Commented:

on 3 Feb 2021

Community Treasure Hunt

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

Start Hunting!