我有一个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