我试图使我的代码的一部分在MatLab中更快地运行,我想使用parfor。尝试执行此操作时,遇到有关我的变量D_all
之一的以下错误。
“由于使用D_all的方式,PARFOR循环无法运行。”
这是我的代码示例。
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循环”