Использование цикла for внутри параллели цикла for в Matlab - PullRequest
0 голосов
/ 13 февраля 2019

Я пытаюсь использовать цикл for внутри цикла parfor в Matlab.
Цикл for эквивалентен примеру балла в здесь .
Внутри for loop вызывается функция ballBouncing, представляющая собой систему из 6 дифференциальных уравнений.

Итак, я пытаюсь использовать 500 различных наборов значений параметров для системы ODE и запускать их, но для каждого набора параметров добавляется внезапный импульс, который обрабатывается с помощью кода вцикл «для».

Однако я не понимаю, как реализовать это, используя цикл parfor и for, как показано ниже.
Я мог бы запустить этот код, используя два цикла 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 внешний цикл.

1 Ответ

0 голосов
/ 13 февраля 2019

Исправить назначение в 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 может обрабатывать только циклы, в которых итерации не зависят от порядка.

...