2011-01-25 246 views
16

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

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

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

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

感谢。

回答

8

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

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

4

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

-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 
2

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

东西,你与尝试,说你与颂歌套件搞乱,你会得到很多的警告:矩阵奇异,因为你改变了一些参数,并不能预测会发生什么,在一个单独的会话中运行:

dos('matlab -automation -r &') 

你可以在不重新启动整个Matlab的情况下杀死它。

1

我采用的一种解决方案 - 与java代码一起使用,但概念与mexFunctions相同,只是messier - 是返回一个FutureValue,然后循环,而FutureValue.finished()或其他返回true。实际的代码在另一个线程/进程中执行。包装一个尝试,抓住这一点,在catch块中的FutureValue.cancel()适用于我。

在mex函数的情况下,您将需要返回指向具有您需要的所有数据的结构/对象(native native handler,bool for complete等)的指针的某个指针(作为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 
+0

这似乎是我需要的东西。然而,这个函数叫做mexCancel,那个看起来怎么样? – patrik 2014-06-03 12:38:08

0

,如果你正在运行的Linux上的MATLAB,你可以在linux consule通过命令终止MATLAB。

顶部

那么你可以使用此代码MATLAB杀: 首先应该通过这个代码中找到MATLAB的PID号 杀

例如: 杀58056

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

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

1

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

Alt键 + F4

(我指的是同时按下 'Alt键' 和键盘上的 'F4' 键)。

另外,在其他的答案中提到,

Ctrl键 + C

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

相关问题