【问题标题】:How to clear persistent variables while keeping breakpoints in MATLAB?如何在 MATLAB 中保留断点的同时清除持久变量?
【发布时间】:2011-01-31 16:14:14
【问题描述】:

有没有办法清除 MATLAB 函数中的所有持久变量,同时将断点保留在相应的函数文件中?

clear all;

clear functions;

都杀死断点。

【问题讨论】:

    标签: matlab persistent


    【解决方案1】:

    很遗憾,清除持久变量也会清除断点,但有一种解决方法。

    设置要保留的断点后,使用dbstatus 函数获取包含这些断点的结构,然后将该结构保存到 MAT 文件中。清除变量后,您可以通过加载 MAT 文件并使用 dbstop 重新加载这些变量。以下是执行此操作序列的示例:

    s=dbstatus;
    save('myBreakpoints.mat', 's');
    clear all
    load('myBreakpoints.mat');
    dbstop(s);
    

    【讨论】:

    • 请注意,在 Matlab 2009b(我认为)之前,他们修复了错误,加载的断点在编辑器中不可见 - 但它们在那里。
    • @RTBarnard 感谢您的解决方案。不幸的是,它在 @-folder 类中不起作用,因为断点所在的文件必须在搜索路径上,而 @-folder 会从该路径中排除。
    • @Jonas 我的 R2009b 仍然存在错误
    • @Philipp:啊,所以我在 2010a 的发行说明中看到该错误已修复。
    • 问题是为什么他们决定在clear all 被调用时也删除断点?当他们决定这样做时,他们是怎么想的。我真的不明白..
    【解决方案2】:

    如果@directories里有数据,还是可以使用RTBarnard提出的方法

    s=dbstatus('-completenames');
    save('myBreakpoints.mat','s');
    %# if you're clearing, you may as well just clear everything
    %# note that if there is stuff stored inside figures (e.g. as callbacks), not all of 
    %# it may be removed, so you may have to 'close all' as well
    clear classes 
    load('myBreakpoints.mat')
    dbstop(s);
    
    %# do some cleanup
    clear s
    delete('myBreakpoints.mat')
    

    【讨论】:

      【解决方案3】:

      根据 RTBarnard 和 Jonas 的解决方案构建,我想出了一个脚本,它避免了从文件保存和加载的需要。但是请注意,这并不能清除 Jonas 解决方案之类的类。我还关闭了所有数字,因为这是我在清除所有内容时通常想要做的事情。这里是:

      % Close all figures including those with hidden handles
      close all hidden;
      
      % Store all the currently set breakpoints in a variable
      temporaryBreakpointData=dbstatus('-completenames');
      
      % Clear functions and their persistent variables (also clears breakpoints 
      % set in functions)
      clear functions;
      
      % Restore the previously set breakpoints
      dbstop(temporaryBreakpointData);
      
      % Clear global variables
      clear global;
      
      % Clear variables (including the temporary one used to store breakpoints)
      clear variables;
      

      此脚本和其他一些 Matlab 实用程序位于 Github here

      【讨论】:

      • 将断点保存在内存中比写入文件要好得多。
      • 这将是我的首选答案。谢谢你的剧本!
      • @ndj 没问题。在 Matlab 中工作时,我仍然一直使用这个脚本。我写的唯一一个实用性接近的另一个是将图形导出为具有指定大小的矢量 pdf 文件,并且所有额外的空白都被裁剪掉了。那个唯一有用的,因为我经常使用 LaTeX。
      【解决方案4】:
      s=dbstatus; % keep breakpoints
      evalin('base','clear classes')
      dbstop(s);
      

      要复制到函数文件中(例如 myclearclasses) 这样就不需要临时的 .mat 文件了。

      【讨论】:

        【解决方案5】:

        很简单,你应该使用 * 作为正则表达式来查找所有变量。它会清理整个工作区并且断点会存在。

        clear *;
        

        【讨论】:

          【解决方案6】:

          我使用preferences 和其他人的回答想出了一个快速解决方案:

          setpref('user', 'breakpointBackup', dbstatus('-completenames'));
          clear all;
          clear import;
          clear java;
          dbstop(getpref('user', 'breakpointBackup'));
          

          这种方法的优点是非常干净(即没有临时文件)并且可以清除所有内容。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2018-10-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多