没有断点暂停Matlab

时间:2015-05-26 07:28:38

标签: matlab

我的脚本运行的时间比我预期的要长很多,它已经运行了3天,只取得了55%的进展。

我非常乐意以67%左右停止它(我可以没有剩余的33%)但是如果我现在停止它(ctrl + c或ctlr + break),我将丢失所有数据。

那么有没有办法暂停Matlab,也许进入调试模式,这样我就可以检查变量而不会丢失数据?

5 个答案:

答案 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.')