web-dev-qa-db-fra.com

comment arrêter un script en cours d'exécution dans Matlab

J'écris un long script dans Matlab, par exemple.

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

Il semble courir pour toujours. Parce que j'appuie sur F5 dans la fenêtre de l'éditeur. Je ne peux donc pas appuyer sur C-Break pour s’arrêter dans la console Matlab.

Je veux juste savoir comment arrêter le script. Je suis actuellement en train d’utiliser Task Manager pour tuer Matlab, ce qui est vraiment idiot. 

Merci. 

16
Yin Zhu

L'aide de Matlab indique ceci - Pour les fichiers M qui s'exécutent longtemps, ou qui appellent des fichiers intégrés ou des fichiers MEX qui s'exécutent longtemps, Ctrl + C n'arrête pas toujours efficacement l'exécution. Cela se produit généralement sur les plates-formes Microsoft Windows plutôt que sur les plates-formes UNIX [1]. Si vous rencontrez ce problème, vous pouvez aider MATLAB à interrompre l'exécution en incluant une fonction drawnow, pause ou getframe dans votre fichier M, par exemple, au sein d'une grande boucle. Notez que Ctrl + C peut être moins réactif si vous avez démarré MATLAB avec l'option -nodesktop.

Donc, je ne pense pas qu'aucune option existe. Cela se produit avec de nombreuses fonctions complexes de matlab. Soit nous devons attendre ou ne pas les utiliser!.

8
S Krishna Kumar

Si ctrl + c ne répond pas tout de suite parce que votre script est trop long/complexe, maintenez-le.

La commande break ne s'exécute pas lorsque matlab exécute certains de ses scripts plus profonds, et soit elle n'enregistre pas de séquence ctrl dans le tampon, soit elle efface le tampon juste avant ou juste après avoir terminé ces éléments de code. Dans les deux cas, lorsque Matlab reviendra pour exécuter davantage de votre script, il reconnaîtra que vous tenez les touches ctrl + c et que vous terminez.

Pour les programmes plus longs, j’essaie généralement de trouver le bon endroit pour fournir une mise à jour de statut et j’accompagne toujours cela d’un certain temps en utilisant tic et toc. En fonction de ce que je fais, je pourrais utiliser le temps d'exécution, le temps de segment, une sorte de moyenne, etc.

Pour les programmes très longs, j’ai trouvé cela particulièrement utile http://www.mathworks.com/matlabcentral/fileexchange/16649-send-text-message-to-cell-phone/content/send_text_message. m

mais il semble qu'ils aient aussi de nouvelles fonctions pour cela.

5
Mach

MATLAB ne répond pas à Ctrl-C lors de l'exécution d'une fonction implémentée par mex telle que svd. De même, lorsque MATLAB alloue une grande quantité de mémoire, il ne répond pas. Une bonne pratique consiste à toujours exécuter vos fonctions pour une petite quantité de données. Lorsque tous les tests sont réussis, exécutez-les à l'échelle réelle. Lorsque le temps est un problème, vous souhaitez analyser le temps d'exécution de chaque segment de code ainsi que leur complexité en termes de temps approximatif.

4
Memming

Pensez à avoir plusieurs sessions matlab. Conservez la fenêtre principale de la session (la jolie avec toutes les couleurs, le gestionnaire de fichiers, l’historique des commandes, l’espace de travail, l’éditeur, etc.) pour exécuter des tâches dont vous savez qu’elles vont se terminer.

Les choses que vous expérimentez, disons que vous bousillez avec ode suite et que vous recevez beaucoup d’avertissements: matrix singular, parce que vous avez modifié certains paramètres et que vous n’avez pas prédit ce qui se passerait, exécutez une session séparée:

dos('matlab -automation -r &')

Vous pouvez tuer cela sans avoir à redémarrer tout Matlab. 

2
Rem

Puisque vous avez mentionné le Gestionnaire des tâches, je suppose que vous utilisez Windows. En supposant que vous exécutiez votre script dans l'éditeur, si vous ne vous opposez pas à quitter l'éditeur en même temps que le programme en cours d'exécution, le raccourci clavier permettant de terminer un processus est le suivant:

Alt + F4

(J'entends par là, appuyez simultanément sur les touches 'Alt' et 'F4' de votre clavier.)

Alternativement, comme mentionné dans d'autres réponses,

Ctrl + C

devrait également fonctionner, mais ne quittera pas l'éditeur.

1
Parthian Shot

Une solution que j’ai adoptée - pour une utilisation avec du code Java, mais le concept est identique à celui de mexFunctions, mais est encore plus compliqué - consiste à renvoyer une valeur FutureValue, puis à la boucle tandis que FutureValue.finished () ou toute autre valeur renvoyée est vraie. Le code actuel s'exécute dans un autre thread/processus. Faire un essai, attraper cela et un FutureValue.cancel () dans le bloc catch fonctionne pour moi.

Dans le cas de fonctions mex, vous devrez renvoyer un certain type de pointeur (sous la forme d'un int) qui pointe vers un struct/objet contenant toutes les données nécessaires (gestionnaire de thread natif, bool for complete, etc.). Dans le cas d'une mexFunction intégrée, votre mexFunction devra très probablement appeler mexFunction dans le thread séparé. Les fonctions Mex ne sont finalement que des DLL/objets partagés.

Pseudo-code

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
1
KitsuneYMG

si vous utilisez votre matlab sur linux, vous pouvez terminer matlab par commande dans linux consule . vous devez d’abord trouver le numéro PID de matlab par ce code:

haut

alors vous pouvez utiliser ce code pour tuer matlab: kill 

exemple: kill 58056

0
mehdi SH