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

Matlab 如何使这四个循环并行计算?,matlab,parallel-processing,parfor,Matlab,Parallel Processing,Parfor,我对MathWorks在Matlab中的并行计算工具箱有一个问题。请参阅下面的代码 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

我对MathWorks在Matlab中的并行计算工具箱有一个问题。请参阅下面的代码

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循环,matlab会警告我,
MX_j
不是有效变量。我不知道如何解决这个问题,也不知道如何使这些for循环并行计算?

对我来说,似乎可以将其合并到一个循环中。创建组合单元阵列

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
时,必须预先分配阵列。以下代码可以工作(由于缺少测试数据而未测试):


注意:据我所知,这里的
parfor
循环会慢得多。您只需分配一些值……根本不需要计算。工作池的设置将占用总执行时间的99.9%。

parfor
不是一根魔杖。您确定已尽可能优化循环吗?首先,请确认请接受我内心深处的感谢。至于这里的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