在MATLAB中使用嵌套递归for循环进行并行循环

时间:2017-05-02 17:55:43

标签: matlab loops recursion parallel-processing

平行循环。

您好,我无法弄清楚我应该为我的代码部分使用什么类型的循环。 我的问题是我想运行具有多个初始条件的程序。例如,假设我有一个矩阵q,其尺寸是4乘2. q(:,1)是第一组初始条件和q(: ,2)是第二组初始条件。 我想要的是递归for循环(第11-22行)以获取独立的初始条件q(:,1)和q(:,2)并同时独立地通过for循环运行它们。 这是一些模拟代码(遗憾的是,由于NDA,我无法使用实际代码):

1   p=ones(3,2); %initial condition
2   q=2.*ones(4,2); %initial condition
3   r=3.*ones(3,2); %initial condition

4   k=1;     %here i want it to iterate for k=1:2 in parallel (i think)
5   pp=p(:,k);
6   qq=q(:,k);
7   rr=r(:,k);

8   p=p(:,k);
9   q=q(:,k);
10  r=r(:,k); %for loop below requires vector form.

11      for t=0:.5:60
12          v=[p;q;r];  %initial conditions for ode45
13          tspan=[t,t+.25,t+.5];
14          [T,Y]=ode45('somefunc',tspan,v,...);
15          v=Y(3,:);
16          p=v(1:3);
17          q=v(4:7);
18          r=v(8:10);

   %building up a matrix with all the data from the iterated/recursive ode45
19          pp=cat(2,pp,p); 
20          qq=cat(2,qq,q);
21          rr=cat(2,rr,r);
22      end

上面的代码仅评估k = 1或k = 2。它不迭代k = 1:2。 我想要的是最终得到pp,qq和rr的多维数组,用于两个(在某一点n)可能的初始条件。即pp(:,:,1)将是具有第一个初始条件的矩阵,而pp(:,:,2)将是第二个初始条件。同样适用于qq和rr。

这就是为什么我认为我需要并行for循环呢?因此,由于第11-22行中的for循环,可以再次调用第1行到第3行中的初始条件而不是我的变量的重新定义值。 我也很困惑如何满足parfor对独立迭代的要求,同时在内部具有依赖迭代的嵌套for循环。

如果您还有其他任何希望我进一步解释或澄清的话,请告诉我。

感谢您的时间和帮助!

1 个答案:

答案 0 :(得分:0)

我承认我没有阅读所有内容,但如果你只是想要两次进行两次计算,你可以按照你的建议在k上使用parfor。您需要复制所有变量 - 否则您将使用两个计算来处理它们,从而破坏事物。这件事真的需要function。将m文件定义为函数,并带有签名

function(whatever,args,should,return,,like,pp,etc) = funcName(k)
    %Copy paste here all the code above you want, given a `k`

在主脚本中,正如您所建议的那样k标准:

result = cell(1,2)
enter code here
parfor k=1:2
    result{k}=funcName(k)

matlab resource for functions