我有一個matlab腳本,它依次執行5個算法。所有這5種算法都需要運行10次不同的初始化。如何重新啓動MATLAB停止的腳本?
每當初始化時出現錯誤,腳本退出並顯示一條錯誤消息。我解決了這個問題(比如數據問題)並開始再次運行腳本,該腳本從第一次初始化開始執行。
我不想讓我的代碼運行以前執行的初始化。 (從1次運行到i-1運行)
一種方法是重新分配索引的值,從i開始,這又需要每次一次又一次修改腳本。
有沒有什麼辦法可以從第一個初始化開始重新啓動腳本,而不需要修改腳本?
我有一個matlab腳本,它依次執行5個算法。所有這5種算法都需要運行10次不同的初始化。如何重新啓動MATLAB停止的腳本?
每當初始化時出現錯誤,腳本退出並顯示一條錯誤消息。我解決了這個問題(比如數據問題)並開始再次運行腳本,該腳本從第一次初始化開始執行。
我不想讓我的代碼運行以前執行的初始化。 (從1次運行到i-1運行)
一種方法是重新分配索引的值,從i開始,這又需要每次一次又一次修改腳本。
有沒有什麼辦法可以從第一個初始化開始重新啓動腳本,而不需要修改腳本?
您不妨考慮另一種方法是檢查點。我已經使用了類似的方法,在任何時候機器可能無法使用的環境中運行,例如長時間運行(超過一天)循環。分佈式的備用機器集羣在實驗室中。
基本上,您在開始循環之前檢查是否存在「檢查點」文件。如果確實如此,那麼上一次循環沒有成功完成。它包含有關循環起始位置的信息以及需要再次執行的其他任何狀態。
這裏有一個簡單的例子:
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
...
你可以(在命令行)類型:
for iter=l:n,
%%% copy - paste your code inside the loop
end
我建議你使用嘗試和抓,並檢查該指標成功。
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
現在我有類似的模板。然而,當@ iter = 5發生錯誤時,我修復它,並再次從iter = 5:n重新運行(修改過的)腳本。有沒有辦法修改腳本重新啓動它,在這種情況下從iter = 5。 – Learner 2012-01-12 08:50:37
也許我不清楚。這不會修改腳本。您只需在命令行中鍵入它。 – Oli 2012-01-12 08:58:50