如何从停止的地方重启matlab脚本?

时间:2012-01-12 08:39:32

标签: matlab

我有一个matlab脚本,它按顺序执行5个算法。所有这5种算法都需要运行10次不同的初始化。

每当 i 初始化时出现错误时,脚本都会退出并显示错误消息。我修复了问题(例如,数据问题)并再次开始运行脚本,该脚本从第一次初始化开始执行。

我不希望我的代码运行以前执行的初始化。 (从1跑到i-1奔跑)

一种方法是将index的值重新分配为从 i 开始,这反过来又要求每次都要一次又一次地修改脚本。

有没有办法从 i -th初始化开始重新启动脚本,而不需要修改脚本?

3 个答案:

答案 0 :(得分:4)

我建议您使用尝试捕获,并检查哪些索引成功。

 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

答案 1 :(得分:2)

您可能想要考虑的另一种技术是检查点。我已经使用类似于长时间运行(超过一天)的循环,这些循环在机器可能随时变得不可用的环境中运行,例如在实验室中分布的备用机器集群。

基本上,在开始循环之前,检查是否存在“检查点”文件。如果确实如此,那么上次循环没有成功完成。它包含有关循环起作用的信息以及您需要再次进入的任何其他状态。

这是一个简化的例子:

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
...

答案 2 :(得分:0)

您可以输入(在命令行中):

for iter=l:n,
%%% copy - paste your code inside the loop
end