indexing within parfor loop

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

Guillaume
Guillaume 2018년 2월 1일
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.

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

답변 (2개)

Rik
Rik 2018년 2월 1일
편집: Rik 2018년 2월 1일

0 개 추천

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 2018년 2월 2일

0 개 추천

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

카테고리

도움말 센터File Exchange에서 Loops and Conditional Statements에 대해 자세히 알아보기

제품

태그

질문:

2018년 2월 1일

답변:

2018년 2월 2일

Community Treasure Hunt

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

Start Hunting!

Translated by