comment arrêter un script d'exécution dans Matlab [dupliquer]
Cette question a déjà une réponse ici:
- comment annuler un programme en cours D'exécution à MATLAB? 1 réponse
j'écris un script de longue durée dans Matlab, par exemple
tic;
d = rand(5000);
[a,b,c] = svd(d);
toc;
il semble courir pour toujours. J'appuie sur F5 dans la fenêtre de l'éditeur. Donc je ne peux pas appuyer sur C-Break pour arrêter dans la console Matlab.
je viens de vous voulez savoir comment arrêter le script. Je suis responsable des tâches pour tuer Matlab, ce qui est vraiment stupide.
Merci.
8 réponses
Matlab help dit ceci- Pour les M-files qui tournent longtemps, ou qui appellent des built-ins ou des MEX-files qui tournent longtemps, Ctrl+C n'arrête pas toujours efficacement l'exécution. Typiquement, cela se produit sur les plates-formes Microsoft Windows plutôt que sur les plates-formes UNIX[1]. Si vous rencontrez ce problème, vous pouvez aider L'exécution de casse de MATLAB en incluant une fonction drawnow, pause, ou getframe dans votre m-file, par exemple, dans une grande boucle. Notez que Ctrl+C pourrait être moins réactif si vous avez commencé MATLAB avec l'-nodesktop option.
donc je ne pense pas qu'il y ait d'option. Cela se produit avec de nombreuses fonctions matlab qui sont complexes. Soit nous devons attendre ou ne les utilisez pas!.
si ctrl+c ne répond pas tout de suite parce que votre script est trop long/complexe, retenez-le.
la commande break ne s'exécute pas lorsque matlab exécute certains de ses scripts plus profonds, et soit il n'enregistre pas de séquence ctrl dans le buffer, soit il efface le buffer juste avant ou juste après avoir terminé ces morceaux de code. Dans les deux cas, lorsque matlab retourne exécuter plus de votre script, il reconnaîtra que vous détenez ctrl+c et terminera.
pour plus longtemps en exécutant des programmes, j'essaie habituellement de trouver un bon endroit pour fournir une mise à jour de statut et j'accompagne toujours cela avec une certaine mesure de temps en utilisant tic et toc. Selon ce que je fais, je pourrais utiliser le temps d'exécution, le temps de segment, une sorte de moyenne, etc...
pour les programmes de très longue durée, j'ai trouvé cela exceptionnellement utile http://www.mathworks.com/matlabcentral/fileexchange/16649-send-text-message-to-cell-phone/content/send_text_message.m
mais il on dirait qu'ils ont certaines nouvelles fonctions pour cela aussi.
MATLAB ne répond pas à Ctrl-C lors de l'exécution d'une fonction implémentée par mex comme svd. Aussi quand MATLAB alloue un gros morceau de mémoire il ne répond pas. Une bonne pratique est de toujours exécuter vos fonctions pour une petite quantité de données, et lorsque tous les passages de tests exécutez l'échelle réelle. Quand le temps est un problème, vous voudriez analyser combien de temps chaque segment de code court aussi bien que leur complexité de temps approximatif.
envisager plusieurs séances de matlab. Gardez 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 l'exécution des choses que vous savez sera résilié.
choses que vous expérimentez, dites que vous jouez avec Ode suite et vous obtenez beaucoup d'Avertissements: matrix singulier, parce que vous avez modifié un paramètre et n'avez pas prédit ce qui se passerait, exécutez dans une session séparée:
dos('matlab -automation -r &')
Vous pouvez tuer que, sans avoir à redémarrer l'ensemble de Matlab.
une solution que j'ai adoptée--pour une utilisation avec du code java, mais le concept est le même avec mexFunctions, juste messier--est de retourner une valeur Futureainsi une boucle pendant que la valeur Futureest.fini (ou ce que renvoie la valeur true. Le code actuel s'exécute dans un autre thread/process. J'enroule un essai, vois autour de ça et une valeur future.cancel() dans le bloc catch fonctionne pour moi.
Dans le cas de mex fonctions, vous devrez retourner somesort de pointeur (un int) qui pointe vers une struct/objet possède toutes les données dont vous avez besoin (gestionnaire de thread natif, bool pour complete etc). Dans le cas d'un bâti en mexFunction, votre mexFunction sera très probablement besoin d'appeler qui mexFunction dans le thread séparé. Les fonctions Mex ne sont finalement que des objets DLLs/partagés.
Pseudo
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
puisque vous avez mentionné le Gestionnaire des tâches, je suppose que vous utilisez Windows. En supposant que vous exécutez votre script dans l'éditeur, si vous n'êtes pas opposé à quitter l'éditeur en même temps que vous quittez le programme en cours d'exécution, le raccourci clavier pour terminer un processus est:
Alt+ F4
(j'entends par là que vous appuyez simultanément sur les touches 'Alt' et 'F4' de votre clavier.)
alternativement, comme indiqué dans d'autres les réponses,
Ctrl+ C
devrait aussi fonctionner, mais ne quittera pas l'éditeur.
si vous utilisez votre matlab sous linux, vous pouvez résilier le matlab par la commande linux consule. vous devez d'abord trouver le numéro PID de matlab par ce code:
haut de page
ensuite, vous pouvez utiliser ce code pour tuer matlab: tuer
exemple: tuer 58056
Pour les ajouter sur:
vous pouvez insérer une vérification de l'heure dans une boucle avec blocage intensif ou possible, c'est-à-dire.
:
section_toc_conditionalBreakOff;
:
dans cette section
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