我的脚本运行的时间比我预期的要长很多,它已经运行了3天,只取得了55%的进展。
我非常乐意以67%左右停止它(我可以没有剩余的33%)但是如果我现在停止它(ctrl + c或ctlr + break),我将丢失所有数据。
那么有没有办法暂停Matlab,也许进入调试模式,这样我就可以检查变量而不会丢失数据?
答案 0 :(得分:2)
命令(需要在启动功能之前手动输入!)
dbstop if error
应该捕获一个ctrl-c并让你进入调试模式。
答案 1 :(得分:0)
我假设你在这里迭代地做了一些事情而不依赖于内置的matlab函数。
我通常解决问题的方法是在该计数器上有一个迭代计数器和一个if
语句 - 当条件满足时,该语句有一个断点。
这样的事情:
itCounter = 0;
itHalt = 100;
while (someCondition)
if (itCounter == itHalt)
itCounter = 0; %<= Put a breakpoint here
else
itCounter = itCounter+1;
end
% Here you calculate away whatever you need to calculate
end
这样,在每个itHalt迭代中,你都会得到一个断点。此外,由于我们正在处理matlab,因此只要断点被击中,就可以根据需要更改itHalt的值。
答案 2 :(得分:0)
我正在考虑另一种解决方案:
让我们有一个基本上由主循环组成的脚本。
脚本定期将有关执行状态的信息(例如完成的迭代次数)写入日志文件。
此外,脚本会定期从输入文件中读取一个数字
1 meaning "continue"
0 meaning "stop the script execution"
在模拟开始时,1写在文件中。
用户可以阅读日志,并可以在某个时间点决定停止脚本。
要做到这一点,他只需要将文件中的1 to 0
更改为保存。
if部分会释放读取的值。
If 1, nothing appens and the script continues running.
If 0, a break statement terminates the main loop and the script stops.
在break
语句之前,在if部分中,脚本将整个工作区保存到.mat
文件中。
用户现在可以访问MatLab(他可以关闭MatLab)并且可以查看例如脚本生成的输出文件,处理它们,制作somo图等等。
然后他可能会决定从停止脚本的位置继续执行脚本。
在脚本开始时,变量控制脚本的执行方式:
Mode 0: start from the beginning
Mode 1: resume the script
if - else
部分会影响用户选择。
特别是,如果选择了模式1,脚本将加载先前保存的工作空间(存储在.mat文件中),然后将脚本的某些变量的值设置为旧值。
作为一个例子:当for循环的索引是100时,脚本停止了。
如果for循环定义为
for i=start_loop_1:100000
在if的模式1中,start_loop_1设置为i + 1(i
的值已保存在.mat
文件中。
这允许循环&#34;继续&#34;从停止点开始执行。
为了有效地恢复&#34;运行脚本时,脚本中使用的其他一些变量可能需要在模式1部分中以相同的方式进行管理。
如果是&#34;大&#34;,&#34;复杂&#34;脚本这可能很难,但......并非不可能
此解决方案已在以下脚本中实现。
我可以看到潜在的重要性,包括用户在脚本读取的同时保存包含1,0的文件的不幸情况。
% Flag to select the running mode
% Mode 0: start from the beginning
% Mode 1: resume the running
continue_my_script=1;
% if "Mode 1" has been selected, the "old" workspace is loaded and some
% variables are properly set
if(continue_my_script == 1)
load my_script_data
start_loop_1=i+1;
start_loop_2=1;
% if Mode 0 has been selected some variables are set to their default value
else
start_loop_1=1;
start_loop_2=1;
% counter to enable writing of the log file
cnt_log=0;
% counter to enable reading the "go / no go" input file
cnt_go=0;
end
% Definition of the condition for writing the log file (in this case, a
% certain number of iterations")
log_iter=13;
% Definition of the condition for reading the "go / no go" input file (in
% this case, a certain number of iterations")
go_nogo_iter=20;
% Starting point of the "real script"
for i=start_loop_1:100000
% Increment the log counter
cnt_log=cnt_log+1;
% if "log_iter" have been done, update the log file
if(cnt_log == log_iter)
cnt_log=0;
t=clock;
fp=fopen('my_script_log.log','wt');
fprintf(fp,'i= %d at %d %d %f\n',i,floor(t(4)),floor(t(5)),t(6));
fclose(fp);
end
% Another loop of the script
for j=start_loop_2:100000
a(i,j)=sqrt(i);
end
% Increment the "read input file" counter
cnt_go=cnt_go+1;
% if "go_nogo_iter" have been done, read the go_nogo input file
if(cnt_go == go_nogo_iter)
cnt_go=0;
fp1=fopen('my_script_go.log','rt');
go_nogo=fscanf(fp1,'%d');
fclose(fp1);
% If the user made the decision to stop the execution, save the workspace
% and exit; otherwise ... do noting, just continue running
if(go_nogo == 0)
save my_script_data
break;
end
end
end
希望这有帮助。
答案 3 :(得分:0)
好的,只是用评论的其他用户的意见重新评论我在评论中所说的内容。如果您的脚本是MATLAB脚本(不是函数),只要您没有明确调用&#39; clear&#39;,就可以从工作区访问所有变量。如果脚本已停止,则在脚本中。在通常情况下,ctrl + c将终止正在运行的脚本。脚本中使用的MATLAB变量仍可从MATLAB工作区访问。
答案 4 :(得分:0)
我不认为在代码已经运行时你可以做任何事情,除非你预先设置了一些钩子。其中一些建议对此有好处。这是我喜欢的另一个:说你要离开一夜,但第二天又回来了,所以你希望你的代码运行14个小时,然后停下来等待你,无论它有多少数据在那里时间。
start_time = now;
final_time = start_time + 10/86400; % datenums are in days in Matlab, so +14/24 for 14 hours
% alternative: final_time = datenum('12-Aug-2015 09:00:00');
while now < final_time
% do work
disp('Working...')
pause(1)
end
% potential clean up code to save results
disp('Clean up code.')