MrAzzman已经指出如何线性化嵌套循环。这是线性化嵌套循环的一般解决方案。
1)假设你有一个简单的嵌套循环结构:
%dummy function for demonstration purposes
f=@(a,b,c)([a,b,c]);
%three loops
X=cell(4,5,6);
for a=1:size(X,1);
for b=1:size(X,2);
for c=1:size(X,3);
X{a,b,c}=f(a,b,c);
end
end
end
2)使用for循环的基本线性化:
%linearized conventional loop
X=cell(4,5,6);
iterations=size(X);
for ix=1:prod(iterations)
[a,b,c]=ind2sub(iterations,ix);
X{a,b,c}=f(a,b,c);
end
3)使用parfor循环进行线性化。
%linearized parfor loop
X=cell(4,5,6);
iterations=size(X);
parfor ix=1:prod(iterations)
[a,b,c]=ind2sub(iterations,ix);
X{ix}=f(a,b,c);
end
4)使用具有传统for循环的第二个版本,改变执行迭代的顺序。如果有什么依赖于此,你必须颠倒索引的顺序。
%linearized conventional loop
X=cell(4,5,6);
iterations=fliplr(size(X));
for ix=1:prod(iterations)
[c,b,a]=ind2sub(iterations,ix);
X{a,b,c}=f(a,b,c);
end
使用parfor循环时撤消顺序无关紧要。你根本不能依赖执行的顺序。如果您认为它有所作为,则无法使用parfor。