Как перезапустить скрипт Matlab с того места, где он остановился? - PullRequest
2 голосов
/ 12 января 2012

У меня есть скрипт Matlab, который последовательно выполняет 5 алгоритмов. Все эти 5 алгоритмов должны работать для 10 различных инициализаций.

При возникновении ошибки в i -й инициализации сценарий завершается с сообщением об ошибке. Я исправляю проблему (скажем, проблему с данными) и снова запускаю скрипт, который выполняется с первой инициализации.

Я не хочу, чтобы мой код запускался для ранее выполненной инициализации. (от 1 пробега до i-1 пробега)

Один из способов - переназначить значение index, чтобы оно начиналось с i , что, в свою очередь, требует каждый раз изменять сценарий снова и снова.

Есть ли способ перезапустить сценарий с i -ой инициализации и далее, для которой не требуется изменять сценарий?

Ответы [ 3 ]

4 голосов
/ 12 января 2012

Я предлагаю вам использовать try и catch и проверить, какие индексы были успешными.

 function errorIndexes = myScript(indexes)
     errorIndexes = [];
     errors = {};
     for i = indexes
         try
         %Do something
         catch me                
            errorIndexes(end+1) = i;
            errors{end+1} = me;      
         end
     end
 end

Снаружи у вас должен быть основной файл, подобный этому:

function RunMyScript()
     if exist('unRunIndexes.mat','file')
        unRunIndexes= load('unRunIndexes.mat');
     else
        unRunIndexes= 1:n;
     end
     unRunIndexes= myScript( indexes)
     save('unRunIndexes.mat',unRunIndexes);
end
2 голосов
/ 13 января 2012

Другая техника, которую вы могли бы рассмотреть, это контрольные точки.Я использовал нечто подобное с длительными (более одного дня) циклами, работающими в среде, где машина может стать недоступной в любое время, например, распределенные кластеры запасных машин в лаборатории.

По сути, выпроверьте, существует ли файл «контрольной точки» перед началом цикла.Если это так, это означает, что цикл не завершился успешно в прошлый раз.Он содержит информацию о том, где был установлен цикл, а также о любом другом состоянии, которое вам нужно для возобновления работы.

Вот упрощенный пример:

function myFunction()

  numIter = 10;
  startIter = 1;

  checkpointFilename = 'checkpoint.mat';

  % Check for presence of checkpoint file suggesting the last run did not
  % complete
  if exist(checkpointFilename, 'file')
    s = load(checkpointFilename);
    startIter = s.i;
    fprintf('Restarting from iteration %d\n', startIter);
  end

  for i = startIter:numIter
    fprintf('Starting iteration %d\n', i);
    expensiveComputation();
    save(checkpointFilename, 'i');
  end

  % We succefully finished. Let's delete our checkpoint file
  delete(checkpointFilename);

  function expensiveComputation()
    % Pretend to do lots of work!
    pause(1);
  end

end

Запуск и остановка с помощью ctrl-c часть пути выглядит так:

>> myFunction
Starting iteration 1
Starting iteration 2
Starting iteration 3
Starting iteration 4
Operation terminated by user during myFunction/expensiveComputation (line 27)

In myFunction (line 18)
    expensiveComputation();

>> myFunction
Restarting from iteration 4
Starting iteration 4
Starting iteration 5
...
0 голосов
/ 12 января 2012

Вы можете ввести (в командной строке):

for iter=l:n,
%%% copy - paste your code inside the loop
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...