indexing within parfor loop
17 vues (au cours des 30 derniers jours)
Afficher commentaires plus anciens
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 commentaire
Guillaume
le 1 Fév 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.
Réponses (2)
Rik
le 1 Fév 2018
Modifié(e) : Rik
le 1 Fév 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
0 commentaires
Edric Ellis
le 2 Fév 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
0 commentaires
Voir également
Catégories
En savoir plus sur Loops and Conditional Statements dans Help Center et File Exchange
Produits
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!