我正在尝试在matlab并行度包中使用parfor循环。 我和这个家伙有类似的问题:MATLAB parfor slicing issue?。输出矩阵似乎不被识别为切片变量。在我的具体情况下,我正在尝试在parfor中堆叠使用其他for循环,并且我无法将其他线程中提出的解决方案应用于我的问题。以下是我正在尝试做的一个虚拟示例:
n=175;
matlabpool;
Matred=zeros(n,n);
Matx2Cell = cell(n);
parfor i=1:n
for j=1:n
for k=1:n
Matred(j,k)=exp((j+i+k)/500)
end;
end;
Matx2Cell{i}=Matred;
end;
matlabpool close;
P.S。我知道将parfor放在k-loop而不是i-loop上是有效的...但是我仍然想把它放在i-loop上(我相信它会更真实地节省我的时间)程序)。
非常感谢 FrédéricGodin
答案 0 :(得分:5)
你可以将Matred = zeros(n);
放入parfor体内,但这很慢。而是在其中定义一个带有Matred = zeros(n);
的函数:实际上是相同的,但更快:
function Matred = calcMatred(i,n)
Matred=zeros(n);
for j=1:n
for k=1:n
Matred(j,k)=exp((j+i+k)/500);
end
end
以下是时间比较:
matlabpool
n = 175;
Matx2Cell = cell(n,1);
tic
parfor i=1:n
Matred=zeros(n);
for j=1:n
for k=1:n
Matred(j,k)=exp((j+i+k)/500);
end
end
Matx2Cell{i}=Matred;
end
toc
tic
parfor i=1:n
Matx2Cell{i}=calcMatred(i,n);
end
toc
matlabpool close
在我的机器上,第一个需要7秒,第二个需要0.3秒。
另请注意,我已将Matx2Cell
的声明更改为cell(n,1)
,因为cell(n)
生成n x n
单元格数组。
答案 1 :(得分:1)
您需要将Matred移动到parfor循环体中。这需要完成,因为parfor的每次迭代都需要Matred的新副本。
n=175;
matlabpool;
Matx2Cell = cell(n);
parfor i=1:n
Matred=zeros(n,n);
for j=1:n
for k=1:n
Matred(j,k)=exp((j+i+k)/500)
end;
end;
Matx2Cell{i}=Matred;
end;
matlabpool close;