在 Matlab 中的并行 for 循环中使用 for 循环

Using a for loop inside a parallel for loop in Matlab

我正在尝试在 Matlab 的 parfor 循环中使用 for 循环。
for 循环等同于 here.
中的 ballode 示例 在 for 循环中调用了一个函数 ballBouncing,它是一个由 6 个微分方程组成的系统。

所以,我想做的是为 ODE 系统使用 500 组不同的参数值 运行,但是对于每个参数集,都会添加一个突然的脉冲,这是通过'for' 循环中的代码。

但是,我不明白如何使用 parforfor 循环来实现它,如下所示。
我可以通过使用两个 for 循环来 运行 这段代码,但是当外循环被设为 parfor 时,它会给出错误,
the PARFOR loop cannot run due to the way variable results is used,
the PARFOR loop cannot run due to the way variable y0 is used
Valid indices for results are restricted in PARFOR loops

results=NaN(500,100);
x=rand(500,10);

parfor j=1:500

    bouncingTimes=[10,50];%at time 10 a sudden impulse is added
    refine=2;
    tout=0;
    yout=y0;%initial conditions of ODE system
    paras=x(j,:);%parameter values for the ODE 
    for i=1:2
        tfinal=bouncingTimes(i);
        [t,y]=ode45(@(t,y)ballBouncing(t,y,paras),tstart:1:tfinal,y0,options);
        nt=length(t);
        tout=[tout;t(2:nt)];
        yout=[yout;y(2:nt,:)];

        y0(1:5)=y(nt,1:5);%updating initial conditions with the impulse
        y0(6)=y(nt,6)+paras(j,10);

        options = odeset(options,'InitialStep',t(nt)-t(nt-refine),...
                                 'MaxStep',t(nt)-t(1));
        tstart =t(nt);
    end

    numRows=length(yout(:,1));
    results(1:numRows,j)=yout(:,1);

end
results;

谁能帮我用 parfor 外循环来实现这个。

将分配固定到 results 中相对简单 - 您需要做的是确保始终分配一整列。以下是我的做法:

% We will always need the full size of results in dimension 1
numRows = size(results, 1);
parfor j = ...
    yout = ...; % variable size
    yout(end:numRows, :) = NaN; % Expand if necessary
    results(:, j) = yout(1:numRows, 1); % Shrink 'yout' if necessary
end

但是,y0 更难处理 - parfor 循环的迭代不是顺序独立的,因为您将信息从一个迭代传递到下一个迭代的方式。 parfor 只能处理迭代与顺序无关的循环。