Я пытаюсь заставить часть моего кода работать быстрее в MatLab, и я хотел бы использовать parfor. Когда я пытаюсь это сделать, я получаю следующую ошибку об одной из моих переменных D_all
.
«Цикл PARFOR не может работать из-за способа использования D_all».
Вот пример моего кода.
M = 161;
N = 24;
P = 161;
parfor n=1:M*N*P
[j,i,k] = ind2sub([N,M,P],n);
r0 = Rw(n,1:3);
R0 = repmat(r0,M*N*P,1);
delta = sqrt(dXnd(i)^2 + dZnd(k)^2);
d = R_prime - R0;
inS = Rw_prime(find(sqrt(sum(d.^2,2))<0.8*delta),:);
if isempty(inS)
D_all(j,i,k,tj) = D_all(j,i,k,tj-1);
else
y0 = r0(2);
inC = inS(find(inS(:,2)==y0),:);
dw = sqrt(sum(d(find(sqrt(sum(d.^2,2))<0.8*delta & d(:,2)==0),:).^2,2));
V_avg = sum(dw.^(-1).*inC(:,4))/sum(dw.^(-1));
D_all(j,i,k,tj) = V_avg;
end
end
Я не очень знаком с параллельными вычислениями, и я смотрел руководства в Интернете и не очень понимаю, как применить их к моей ситуации. Думаю, мне нужно «нарезать» D_all
, но я не знаю, как это сделать.
РЕДАКТИРОВАТЬ : Мне кажется, я понимаю, что основная проблема заключается в том, что при использовании D_all
у меня есть tj
и tj-1
.
РЕДАКТИРОВАТЬ 2 : я не показываю это выше, возможно, это было бы полезно, но я определил D_all(:,:,:,1) = V_1;
, где V_1
соответствует предыдущему временному шагу. Я попытался сделать несколько переменных V_2
, V_3
и т. Д. Для каждого шага и заменить D_all(j,i,k,tj-1)
на V_1(j,i,k)
. Это все еще привело к той же ошибке, которую я вижу с D_all
.
"Допустимые индексы для D_all ограничены для циклов PARFOR"