2011-01-25 23 views
16

Escribo una secuencia de comandos de ejecución larga en Matlab, p. Ej.cómo detener una secuencia de comandos en ejecución en Matlab

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

Parece que se ejecuta para siempre. Porque presiono F5 en la ventana del editor. Así que no puedo presionar C-Break para parar en la consola Matlab.

Solo quiero saber cómo detener el script. Soy el Administrador de tareas de uso actual para matar a Matlab, lo cual es realmente tonto.

Gracias.

Respuesta

8

La ayuda de Matlab dice esto: Para archivos M que se ejecutan durante mucho tiempo, o que requieren integrables o archivos MEX que se ejecutan durante mucho tiempo, Ctrl + C no siempre detiene efectivamente la ejecución. Por lo general, esto sucede en las plataformas de Microsoft Windows en lugar de en las plataformas UNIX [1]. Si experimenta este problema, puede ayudar a MATLAB a interrumpir la ejecución incluyendo una función de extracción, pausa o marco en su archivo M, por ejemplo, dentro de un bucle grande. Tenga en cuenta que Ctrl + C puede ser menos receptivo si inició MATLAB con la opción -nodesktop.

Así que no creo que exista ninguna opción. Esto sucede con muchas funciones de matlab que son complejas. O tenemos que esperar o no los usamos !.

4

MATLAB no responde a Ctrl-C mientras ejecuta una función implementada mex como svd. Además, cuando MATLAB destina gran cantidad de memoria, no responde. Una buena práctica es ejecutar siempre sus funciones para una cantidad pequeña de datos, y cuando todos los pases de prueba lo ejecutan para la escala real. Cuando el tiempo es un problema, debería analizar cuánto tiempo se ejecuta cada segmento de código, así como su complejidad de tiempo aproximado.

-3

Para añadir:

puede insertar un control de tiempo dentro de un bucle con bloqueo intensiva o posible, es decir.

: 
section_toc_conditionalBreakOff; 
: 

donde dentro de esta sección

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

considerar tener varias sesiones de MATLAB. Mantenga la ventana principal de la sesión (la bonita con todos los colores, administrador de archivos, historial de comandos, espacio de trabajo, editor, etc.) para ejecutar cosas que sabe que finalizarán.

cosas que usted está experimentando con, digamos que usted está ensuciando con la suite de oda y se obtiene una gran cantidad de advertencias: matriz singular, ya que algún parámetro alterado y no predecir lo que sucedería, ejecute en una sesión separada:

dos('matlab -automation -r &') 

Puede matar eso sin tener que reiniciar todo Matlab.

1

Una solución que adopté - para usar con el código de Java, pero el concepto es el mismo con mexFunctions, simplemente más desordenado - es devolver un FutureValue y luego repetir mientras FutureValue.finished() o lo que sea devuelva verdadero. El código real se ejecuta en otro subproceso/proceso. Envolver un intento, atraparlo y un FutureValue.cancel() en el bloque catch funciona para mí.

En el caso de las funciones mex, tendrá que devolver un cierto puntero (como int) que apunta a una estructura/objeto que tiene todos los datos que necesita (gestor de hilos nativo, bool para completar, etc.). En el caso de una función mexFunction integrada, es probable que su función mexFore necesite llamar a esa función mexF en el hilo por separado. Las funciones de Mex son simplemente archivos DLL/objetos compartidos después de todo.

Pseudocódigo

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

Parece que es algo que necesito. Sin embargo, esta función llamada mexCancel, ¿cómo se vería? – patrik

+0

@patrik Eso depende completamente de cómo se vea su proceso largo. Esencialmente, cancel, isdone y longprocess deberían escribirse en c para que funcionen juntos, se exporten a un archivo dll y luego se escriban funciones mex para llamar a esas funciones. No es fácil ni limpio ni va a haber un código general. – KitsuneYMG

+0

Gracias por la respuesta. Esto parece un poco desalentador, pero de todos modos, si esto se logra, sin duda es una solución hermosa. – patrik

0

si está ejecutando su MATLAB en Linux, se puede terminar el comando Matlab en consule Linux. primero que debe encontrar el número PID de MATLAB por este código:

superior

continuación, puede utilizar este código para matar a MATLAB: matar

ejemplo: matar 58056

5

Si ctrl + c no responde de inmediato porque tu script es demasiado largo/complejo, mantenlo.

El comando break no se ejecuta cuando matlab está ejecutando algunos de sus scripts más profundos, y ya sea no registra una secuencia ctrl en el búfer, o borra el búfer justo antes o justo después de completar esos pedazos de código. En cualquier caso, cuando Matlab regrese para ejecutar más de su script, reconocerá que está presionando ctrl + c y terminará.

Para programas de ejecución más larga, generalmente trato de encontrar un buen lugar para proporcionar una actualización de estado y siempre lo acompaño con un poco de tiempo usando tic y toc. Dependiendo de lo que estoy haciendo, puede ser que utilice el tiempo de ejecución, tiempo del segmento, una especie de media, etc ...

para ejecutar programas muy largos, me pareció que era excepcionalmente útil http://www.mathworks.com/matlabcentral/fileexchange/16649-send-text-message-to-cell-phone/content/send_text_message.m

pero parece que tienen algunas funciones más nuevas para esto también.

1

Como mencionó el Administrador de tareas, supongo que está usando Windows. Suponiendo que se está ejecutando la secuencia de comandos en el editor, si no se opone a salir del editor al mismo tiempo que dejar el programa en ejecución, la combinación de teclas para poner fin a un proceso es:

Alt + F4

(y me refiero a pulsar las teclas 'F4' en su teclado 'Alt' y al mismo tiempo.)

Por otra parte, como se ha mencionado en otras respuestas,

Ctrl + C

también debería funcionar, pero no saldrá del editor.

Cuestiones relacionadas