如何使这四个循环计算并行?

时间:2017-06-30 08:50:00

标签: matlab parallel-processing parfor

我在Matlab中遇到MathWorks Parallel Computing Toolbox的问题。请参阅下面的代码

for k=1:length(Xab)
    n1=length(Z)*(k-1)+1:length(Z)*k;
    MX_j(1,n1)=JXab{k};
    MY_j(1,n1)=JYab{k};
    MZ_j(1,n1)=Z;
end
for k=length(Xab)+1:length(Xab)+length(Xbc)
    n2=length(Z)*(k-1)+1:length(Z)*k;
    MX_j(1,n2)=JXbc{k-length(Xab)};
    MY_j(1,n2)=JYbc{k-length(Yab)};
    MZ_j(1,n2)=Z;
end

for k=length(Xab)+length(Xbc)+1:length(Xab)+length(Xbc)+length(Xcd)
    n3=length(Z)*(k-1)+1:length(Z)*k;
    MX_j(1,n3)=JXcd{k-length(Xab)-length(Xbc)};
    MY_j(1,n3)=JYcd{k-length(Yab)-length(Ybc)};
    MZ_j(1,n3)=Z;
end

for k=length(Xab)+length(Xbc)+length(Xcd)+1:length(Xab)+length(Xbc)+length(Xcd)+length(Xda)

    n4=length(Z)*(k-1)+1:length(Z)*k;
    MX_j(1,n4)=JXda{k-length(Xab)-length(Xbc)-length(Xcd)};
    MY_j(1,n4)=JYda{k-length(Yab)-length(Ybc)-length(Ycd)};
    MZ_j(1,n4)=Z;
end

如果我将for循环更改为parfor-loop,matlab会警告我MX_j不是一个有效的变量。我不知道如何解决这个问题以及如何使这些for循环计算并行计算?

1 个答案:

答案 0 :(得分:0)

对我来说,看起来你可以将它组合成一个循环。创建组合单元阵列。

JX = cat(2,JXab, JXbc, JXcd, JXda);
JY = cat(2,JYab, JYbc, JYcd, JYda);

在此处检查正确的尺寸。如果您的JXcc数组是列数组,请使用cat(1,...

这样做之后,一个循环应该这样做:

n = length(Xab)+length(Xbc)+length(Xcd)+length(Xda);
for k=1:n
    k2 = length(Z)*(k-1)+1:length(Z)*k;
    MX_j(1,k2)=JX{k};
    MY_j(1,k2)=JY{k};
    MZ_j(1,k2)=Z;
end

在平行化之前,请检查这是否仍然有效。我没有测试过。如果一切都很好,您可以切换到parfor

使用parfor时,必须预先分配数组。以下代码可以工作(由于缺少测试数据而未经测试):

n = length(Xab)+length(Xbc)+length(Xcd)+length(Xda);
MX_j = zeros(1,n*length(Z));
MY_j = MX_j;
MZ_j = MX_j;
parfor k=1:n
    k2 = length(Z)*(k-1)+1:length(Z)*k;
    MX_j(1,k2)=JX{k};
    MY_j(1,k2)=JY{k};
    MZ_j(1,k2)=Z;
end

注意: 据我所知,此处parfor循环会慢得多。你只需指定一些值......根本不计算。工作池的设置将占总执行时间的99.9%。