2012-01-12 153 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