2012-01-12 40 views
2

我有一个matlab脚本,它依次执行5个算法。所有这5种算法都需要运行10次不同的初始化。如何重新启动MATLAB停止的脚本?

每当初始化时出现错误,脚本退出并显示一条错误消息。我解决了这个问题(比如数据问题)并开始再次运行脚本,该脚本从第一次初始化开始执行。

我不想让我的代码运行以前执行的初始化。 (从1次运行到i-1运行)

一种方法是重新分配索引的值,从i开始,这又需要每次一次又一次修改脚本。

有没有什么办法可以从第一个初始化开始重新启动脚本,而不需要修改脚本?

回答

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

你可以(在命令行)类型:

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

现在我有类似的模板。然而,当@ iter = 5发生错误时,我修复它,并再次从iter = 5:n重新运行(修改过的)脚本。有没有办法修改脚本重新启动它,在这种情况下从iter = 5。 – Learner 2012-01-12 08:50:37

+0

也许我不清楚。这不会修改脚本。您只需在命令行中键入它。 – Oli 2012-01-12 08:58:50

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