Как правильно "нарезать" 4D матрицу в Matlab в цикле parfor? - PullRequest
0 голосов
/ 05 апреля 2019

Я пытаюсь заставить часть моего кода работать быстрее в 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"

...