windows - outputdir - matlab markdown
Cómo detener un script en ejecución en Matlab (8)
Como mencionó el Administrador de tareas, supongo que está usando Windows. Suponiendo que está ejecutando su script dentro del editor, si no se opone a salir del editor al mismo tiempo que sale del programa en ejecución, el método abreviado de teclado para finalizar un proceso es:
Alt + F4
(Por lo que quiero decir, presione las teclas ''Alt'' y ''F4'' en su teclado simultáneamente.)
Alternativamente, como se menciona en otras respuestas,
Ctrl + C
También debería funcionar, pero no saldrá del editor.
Esta pregunta ya tiene una respuesta aquí:
Escribo un script de larga ejecución en Matlab, por ejemplo
tic;
d = rand(5000);
[a,b,c] = svd(d);
toc;
Parece correr para siempre. En caso de presionar F5 en la ventana del editor. Así que no puedo presionar C-Break para detenerme en la consola de Matlab.
Solo quiero saber como detener el script. Actualmente uso el Administrador de tareas para matar a Matlab, lo cual es realmente tonto.
Gracias.
Considere tener múltiples sesiones matlab. Mantenga la ventana de la sesión principal (la bonita con todos los colores, el administrador de archivos, el historial de comandos, el área de trabajo, el editor, etc.) para ejecutar los elementos que sabe que terminarán.
Las cosas con las que está experimentando dicen que está jugando con ode suite y recibe muchas advertencias: matriz singular, porque modificó algún parámetro y no predijo lo que sucedería, ejecute en una sesión separada:
dos(''matlab -automation -r &'')
Puedes matarlo sin tener que reiniciar todo Matlab.
La ayuda de Matlab dice esto: para los archivos M que se ejecutan durante mucho tiempo, o para los archivos de llamada incorporados o MEX que se ejecutan durante mucho tiempo, Ctrl + C no siempre detiene la ejecución de manera efectiva. Normalmente, esto sucede en las plataformas de Microsoft Windows en lugar de las plataformas UNIX [1]. Si experimenta este problema, puede ayudar a MATLAB a interrumpir la ejecución incluyendo una función dibujar, pausar o obtener marco en su archivo M, por ejemplo, dentro de un bucle grande. Tenga en cuenta que Ctrl + C puede ser menos sensible si inició MATLAB con la opción -nodesktop.
Así que no creo que exista ninguna opción. Esto sucede con muchas funciones matlab que son complejas. O tenemos que esperar o no usarlos !.
MATLAB no responde a Ctrl-C mientras ejecuta una función implementada en mex, como svd. Además, cuando MATLAB asigna gran parte de la memoria, no responde. Una buena práctica es ejecutar siempre sus funciones para una pequeña cantidad de datos, y cuando todas las pasadas de prueba se ejecuten para la escala real. Cuando el tiempo es un problema, desearía analizar cuánto tiempo se ejecuta cada segmento de código, así como su complejidad de tiempo aproximado.
Para agregar en:
puede insertar una verificación de tiempo dentro de un bucle con un interbloqueo intenso 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
Si ctrl + c no responde de inmediato porque su script es demasiado largo / complejo, manténgalo así.
El comando break no se ejecuta cuando matlab está ejecutando algunos de sus scripts más profundos, y o bien no registra una secuencia de control en el búfer, o borra el búfer justo antes o después de completar esos fragmentos de código. En cualquier caso, cuando matlab vuelva a ejecutar más de su secuencia de comandos, reconocerá que está manteniendo ctrl + c y termina.
Para los 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 esté haciendo, podría usar el tiempo de ejecución, el tiempo de segmento, algún tipo de promedio, etc.
Para los programas realmente largos, encontré que esto es 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.
Si está ejecutando su Matlab en Linux, puede terminar el comando MATLAB en linux consule. Primero debes encontrar el número PID de matlab por este código:
parte superior
entonces puedes usar este código para matar matlab: kill
ejemplo: matar 58056
Una de las soluciones que adopté, para usar con el código Java, pero el concepto es el mismo con mexFunctions, solo que más desordenado, es devolver un FutureValue y luego hacer un bucle mientras FutureValue.finished () o lo que sea que devuelva verdadero El código real se ejecuta en otro hilo / proceso. Envolver un intento, atraparlo y un FutureValue.cancel () en el bloque catch funciona para mí.
En el caso de las funciones de mex, deberá devolver una cierta cantidad de puntero (como un int) que apunta a una estructura / objeto que tiene todos los datos que necesita (controlador de subprocesos nativo, bool para completar, etc.). En el caso de un mexFunction incorporado, lo más probable es que su mexFunction tenga que llamar a ese mexFunction en el hilo separado. Las funciones de Mex son solo DLLs / 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