我在Matlab中编写了一个长时间运行的脚本,例如
tic;
d = rand(5000);
[a,b,c] = svd(d);
toc;
它似乎永远在奔跑。我想在编辑器窗口按F5。所以我不能按C-Break来停止在Matlab控制台中。
我只是想知道如何停止脚本。我目前正在使用任务管理器杀死Matlab,这真的很傻。
感谢。
答案 0 :(得分:8)
Matlab帮助说 - 对于运行时间较长的M文件,或者调用内置命令或长时间运行的MEX文件,Ctrl + C并不总能有效地停止执行。通常,这发生在Microsoft Windows平台而不是UNIX [1]平台上。如果遇到此问题,可以通过在M文件中包含drawow,pause或getframe函数来帮助MATLAB中断执行,例如,在大循环中。请注意,如果使用-nodesktop选项启动MATLAB,Ctrl + C的响应速度可能会降低。
所以我认为不存在任何选择。许多matlab函数都很复杂。我们要么等待还是不要使用它们!。
答案 1 :(得分:5)
如果ctrl + c没有立即响应,因为你的脚本太长/太复杂,请按住它。
当matlab执行一些更深层次的脚本时,break命令不会运行,要么它不会在缓冲区中记录ctrl序列,要么在它完成这些代码之前或之后清除缓冲区。在任何一种情况下,当matlab返回执行更多的脚本时,它会识别出你持有ctrl + c并终止。
对于运行时间较长的程序,我通常会尝试找到一个提供状态更新的好地方,并且我总是使用tic和toc在一定时间内陪伴它。根据我在做什么,我可能会使用运行时间,段时间,某种平均值等等。
对于真正长期运行的程序,我发现这非常有用 http://www.mathworks.com/matlabcentral/fileexchange/16649-send-text-message-to-cell-phone/content/send_text_message.m
但看起来他们也有更新的功能。
答案 2 :(得分:4)
执行mex实现的函数(如svd)时,MATLAB不响应Ctrl-C。此外,当MATLAB分配大块内存时,它不会响应。一个好的做法是始终为少量数据运行函数,并且当所有测试过程运行它以实际扩展时。当时间成为问题时,您需要分析每段代码运行的时间以及它们的粗略时间复杂性。
答案 3 :(得分:2)
考虑进行多个matlab会话。保持主会话窗口(包含所有颜色的漂亮窗口,文件管理器,命令历史记录,工作空间,编辑器等)以运行您知道将终止的内容。
你正在尝试的东西,比如说你正在搞乱ode套件并且你得到很多警告:矩阵单数,因为你改变了一些参数并且没有预测会发生什么,在一个单独的会话中运行:
dos('matlab -automation -r &')
你可以杀死它,而无需重新启动整个Matlab。
答案 4 :(得分:1)
我采用的一个解决方案 - 用于java代码,但概念与mexFunctions相同,只是更混乱 - 是返回FutureValue然后循环,而FutureValue.finished()或其他任何返回true。实际代码在另一个线程/进程中执行。包装尝试,抓住它并在catch块中的FutureValue.cancel()为我工作。
对于mex函数,你需要返回指向具有所需数据的结构/对象的一些指针(作为int)(本机线程处理程序,bool完成等)。在内置mexFunction的情况下,你的mexFunction很可能需要在单独的线程中调用mexFunction。毕竟,Mex函数只是DLL /共享对象。
伪代码
FV = mexLongProcessInAnotherThread();
try
while ~mexIsDone(FV);
java.lang.Thread.sleep(100); %pause has a memory leak
drawnow; %allow stdout/err from mex to display in command window
end
catch
mexCancel(FV);
end
答案 5 :(得分:1)
由于您提到了任务管理器,我猜您正在使用Windows。假设您在编辑器中运行脚本,如果您不反对在退出正在运行的程序的同时退出编辑器,则结束进程的键盘快捷键为:
Alt + F4
(我的意思是同时按下键盘上的' Alt'和F4'键。)
或者,如其他答案中所述,
Ctrl + C
也应该有效,但不会退出编辑。
答案 6 :(得分:0)
如果您在linux上运行matlab,可以在linux consule中通过命令终止matlab。 首先你应该通过这段代码找到matlab的PID号:
顶
然后您可以使用此代码来杀死matlab: 杀了
例如: 杀58056
答案 7 :(得分:-3)
添加:
您可以在具有密集或可能死锁的循环中插入时间检查,即
:
section_toc_conditionalBreakOff;
:
本节内容
if (toc > timeRequiredToBreakOff) % time conditional break off
return;
% other options may be:
% 1. display intermediate values with pause;
% 2. exit; % in some cases, extreme : kill/ quit matlab
end