indexing within parfor loop

21 Ansichten (letzte 30 Tage)
Adam
Adam am 1 Feb. 2018
Beantwortet: Edric Ellis am 2 Feb. 2018
Dear All,
I am having troubles with setting up the following parfor loop.
Basically, I have two variables T and tau and I want to loop over them in parallel.
parfor i = 1:length(tau)*length(T)
k = ceil(i/length(T)); %tau
j = i-(k-1)*length(T); %T
p.T = T(j);
p.tau = tau(k);
fun(p);
end
I get the error message that the problem is with the use of variable p.
Could someone help me how to fix this?
Thank you
  1 Kommentar
Guillaume
Guillaume am 1 Feb. 2018
What is the error message?
I would recommend you use numel instead of length. With numel your code will work whether tau and T are matrices or vectors. With length it will break in interesting ways if any of them are matrices.

Melden Sie sich an, um zu kommentieren.

Antworten (2)

Rik
Rik am 1 Feb. 2018
Bearbeitet: Rik am 1 Feb. 2018
parfor loops don't like temporary variables, because it will not be able to guarantee which assignment will be the last, so it can't tell which version of p to keep available. You can fix this by either creating a double nested loop (which you can make parfor if you like), or indexing p.
parfor i = 1:numel(tau)*numel(T)
k = ceil(i/numel(T)); %tau
j = i-(k-1)*numel(T); %T
p(i).T = T(j);
p(i).tau = tau(k);
fun(p(i));
end
or
for i_tau = 1:numel(tau)
for i_T=1:numel(T)
p.T = T(i_T);
p.tau = tau(i_tau);
fun(p);
end
end

Edric Ellis
Edric Ellis am 2 Feb. 2018
The problem here is that parfor can't tell whether you're updating all fields of the variable p, and therefore it thinks there might be order-dependent stuff going on. The simplest way to fix this is to ensure you completely overwrite p on each iteration of your loop, like this:
parfor i = 1:length(tau)*length(T)
k = ceil(i/length(T)); %tau
j = i-(k-1)*length(T); %T
p = struct('T', T(j), 'tau', tau(k));
fun(p);
end

Kategorien

Mehr zu Loops and Conditional Statements finden Sie in Help Center und File Exchange

Tags

Produkte

Community Treasure Hunt

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

Start Hunting!

Translated by