如何在Matlab中停止运行脚本

我在Matlab中编写了一个长时间运行的脚本,例如

tic; d = rand(5000); [a,b,c] = svd(d); toc; 

它似乎永远在运行。 因为我在编辑器窗口中按F5。 所以我不能按C-Break停止在Matlab控制台。

我只想知道如何停止脚本。 我目前使用任务pipe理器来杀死Matlab,这真的很无聊。

谢谢。

Matlab帮助说这个 – 对于长时间运行的M文件,或者长时间运行的内建或MEX文件,Ctrl + C并不总是有效地停止执行。 通常,这发生在Microsoft Windows平台而不是UNIX [1]平台上。 如果遇到这个问题,可以通过在M文件中包含一个drawnow,pause或getframe函数来帮助MATLAB中断执行,例如,在一个大的循环中。 请注意,如果您使用-nodesktop选项启动MATLAB,则Ctrl + C可能不太灵敏。

所以我不认为有任何选择存在。 许多matlab函数都是复杂的。 要么我们必须等待或不要使用它们!

如果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

但看起来他们也有一些更新的功能。

在执行mex实现的函数(如svd)时,MATLAB不响应Ctrl-C。 另外当MATLAB分配大块内存时,它不响应。 一个好的做法是总是运行少量的数据的功能,当所有的测试通过运行实际的规模。 当时间成为问题时,您将需要分析每段代码的运行时间以及粗略的时间复杂度。

考虑有多个matlab会话。 保持主会话窗口(包含所有颜色,文件管理器,命令历史记录,工作区,编辑器等)的主窗口,以便运行你知道会终止的东西。

你正在试验的东西,比如说你在搞Ode套件,并且得到很多警告:矩阵奇异,因为你改变了一些参数,并没有预测到会发生什么,在一个单独的会话中运行:

 dos('matlab -automation -r &') 

你可以杀死,而不必重新启动整个Matlab。

我采用的一个解决方案 – 用于java代码,但概念与mexFunctions一样,只是messier – 是返回一个FutureValue,然后循环FutureFalue.finished()或任何返回true。 实际的代码在另一个线程/进程中执行。 包装一个尝试,赶上,并在catch块的FutureValue.cancel()为我工作。

在mex函数的情况下,您将需要返回一些指针(作为一个int)指向一个结构/对象,它具有所有你需要的数据(本地线程处理程序,布尔完成等)。 在内置mexFunction的情况下,您的mexFunction将很可能需要在单独的线程中调用该mexFunction。 Mex函数毕竟只是DLLs /共享对象。

伪代码

 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 

既然你提到任务管理器,我猜你正在使用Windows。 假设你在编辑器中运行你的脚本,如果你不反对在退出运行程序的同时退出编辑器,那么终止一个进程的键盘快捷键是:

Alt + F4

(我的意思是同时按下键盘上的“Alt”和“F4”键。)

或者,如其他答案所述,

Ctrl + C

也应该工作,但不会退出编辑。

如果你正在linux上运行你的matlab,你可以通过linux consule命令终止matlab。 首先你应该找到这个代码的matlab的PID号码:

最佳

那么你可以使用这个代码来杀死matlab:kill

例如:杀58056

添加:

你可以在一个循环中插入一个时间检查,可能会发生死锁,也就是说,

 : 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