我有一个matlab脚本,它按顺序执行5个算法。所有这5种算法都需要运行10次不同的初始化。
每当 i 初始化时出现错误时,脚本都会退出并显示错误消息。我修复了问题(例如,数据问题)并再次开始运行脚本,该脚本从第一次初始化开始执行。
我不希望我的代码运行以前执行的初始化。 (从1跑到i-1奔跑)
一种方法是将index的值重新分配为从 i 开始,这反过来又要求每次都要一次又一次地修改脚本。
有没有办法从 i -th初始化开始重新启动脚本,而不需要修改脚本?
答案 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