【问题标题】:How to interrupt MATLAB IDE when it hangs on displaying very large array?MATLAB IDE 在显示非常大的数组时挂起时如何中断?
【发布时间】:2012-07-31 13:05:14
【问题描述】:

假设我正在使用 MATLAB IDE,并且我的工作区中碰巧有一些非常大的对象(例如 500k+ 元素的数组)。现在,假设我愚蠢地不小心双击了这些非常大的变量之一,这触发了对数组编辑器的加载。不幸的是,有了这么大的数组,MATLAB 就挂了。

我尝试了 CTRL+C、CTRL+BREAK、CTRL+D,但似乎没有一个能够中断 IDE 的行为。我知道我可以强制 matlab 退出,但首先将所有这些变量读入工作区需要很多时间,而且我可能在编辑器窗口中未保存更改,等等。

【问题讨论】:

  • 使用命令行matlab,所以你不能点击矩阵:p
  • 是的,我想行为修改会很有用,但我确实喜欢 IDE

标签: matlab ide freeze


【解决方案1】:

我找到了一种方法,但它不是最好的,它需要更改路径并返回一次才能获得原始openvar的句柄

function openvar(name,array)
    persistent org_openvar
    if isempty(org_openvar)
        curdir=pwd;
        cd(fullfile(matlabroot,'toolbox/matlab/codetools'));
        org_openvar = @openvar;
        cd(curdir);
    end

    if numel(array)>1e5
        if strcmp(questdlg(sprintf('Opening ''%s'' which has %d elements.\n\nAre you sure? This is gonna take a while!',name,numel(array)), ...
        'Variable editor','Yes','Cancel','Cancel') , 'Yes')
                org_openvar(name,array)
            end
    else
        org_openvar(name,array)
    end
end

得到那个句柄是最大的问题,调用它就好了。如果内置openvar,可以使用builtin函数:

builtin('openvar',name,array)

但不幸的是,情况并非如此 :(
str2func 结合完整路径也不起作用,至少我没有让它起作用......

【讨论】:

  • 我正在添加这些链接以供将来参考:stackoverflow.com/questions/6408759/…stackoverflow.com/questions/6201272/… 具有相同的解决方案,尽管它是用于内置函数
  • 终于去测试你的解决方案了。干得好!我建议进行一个小的编辑,以便您在第五行不使用斜杠构建完整文件,否则它将无法在 Linux 系统上运行(我在其中进行了测试)。这肯定会为我节省一些丢失的 matlab 会话!
  • @DanielKessler 你说得对,我曾经查看fullfile 并注意到底部的f = strrep(f,'/','\'); 调用,但从那时起我只记得有一个strrep,而不仅仅是那一行修复从unix到pc的东西。谢谢你让我解决这个问题!我在这些事情上过于依赖fullfile 并且同时使用 unix 和 windows :p (看来你的编辑被错误地拒绝了,我自己修复了)
【解决方案2】:

变量编辑器使用命令openvar 启动。要解决您的问题,您可以利用 Matlab 怪癖,它会导致函数被同名的变量掩盖。例如,如果您创建一个名为 plot 的变量,plot() 函数将停止工作。

解决方案虽然很老套,但只需创建一个名为 openvar 的空变量。然后任何时候尝试打开变量编辑器都会失败,因为函数openvar 被变量隐藏了。

如果您想再次使用变量编辑器,只需调用clear openvar 删除变量,该函数将被取消屏蔽。

【讨论】:

  • 所以这个想法基本上是首先让变量编辑器更难打开,从而防止单次双击崩溃?聪明的方法:),为我工作。
  • 为什么不编写另一个包装真正的 openvar 函数的 openvar 函数(您自己的)。通过这种方式,您可以在那里为大型矩阵添加检查并询问用户“您确定吗?这需要一段时间!”
  • @DanielKessler:最简单的解决方案很可能是简单地将openvar 的内容复制到修改后的函数中(edit openvar,其余的应该很明显)。
  • 如果它是内置的,事情会更容易,尝试了很多东西,但是在这个问题旁边,openvar在不是从命令行调用时找不到原始变量。所以这里最好的解决方案是将原始openvar.m 中的所有内容复制到您的新文件中。无论如何,功能请求待定:'调用任何阴影函数'
  • 看看我是怎么做到的stackoverflow.com/questions/11781634/…
猜你喜欢
  • 1970-01-01
  • 2016-11-09
  • 2012-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-06
  • 1970-01-01
  • 2022-01-20
相关资源
最近更新 更多