2011-01-25 39 views
16

Scrivo uno script a esecuzione lunga in Matlab, ad es.come fermare uno script in esecuzione in Matlab

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

Sembra funzionare per sempre. Per esempio, premo F5 nella finestra dell'editor. Quindi non posso premere C-Break per fermarmi nella console Matlab.

Voglio solo sapere come interrompere la sceneggiatura. Sono attualmente in uso Task Manager per uccidere Matlab, che è davvero stupido.

Grazie.

risposta

8

La guida di Matlab dice questo: Per i file M che funzionano a lungo, o che chiamano built-in o file MEX che funzionano a lungo, Ctrl + C non ferma sempre l'esecuzione in modo efficace. In genere, ciò accade su piattaforme Microsoft Windows anziché su piattaforme UNIX [1]. Se riscontri questo problema, puoi aiutare MATLAB ad interrompere l'esecuzione includendo una funzione drawnow, pausa o getframe nel tuo file M, ad esempio all'interno di un loop di grandi dimensioni. Nota che Ctrl + C potrebbe essere meno reattivo se hai avviato MATLAB con l'opzione -nodesktop.

Quindi non credo esistano opzioni. Questo succede con molte funzioni MATLAB che sono complesse. O dobbiamo aspettare o non usarli !.

4

MATLAB non risponde a Ctrl-C mentre esegue una funzione implementata in mex come svd. Inoltre, quando MATLAB assegna grandi quantità di memoria, non risponde. Una buona pratica è eseguire sempre le funzioni per una piccola quantità di dati e quando tutti i passaggi di test vengono eseguiti per la scala effettiva. Quando il tempo è un problema, dovresti analizzare quanto tempo viene eseguito ogni segmento di codice e la loro complessità di massima.

-3

Per aggiungere il:

è possibile inserire un controllo di tempo all'interno di un ciclo con stallo intensiva o possibile, vale a dire.

: 
section_toc_conditionalBreakOff; 
: 

dove all'interno di questa sezione

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

considerare avere più sessioni di MATLAB. Mantieni la finestra della sessione principale (quella carina con tutti i colori, il gestore di file, la cronologia dei comandi, lo spazio di lavoro, l'editor, ecc.) Per l'esecuzione di cose che saprai finiranno.

Roba che si stanno sperimentando con, diciamo che si sta scherzi con suite di ode e si ottiene un sacco di avvertimenti: matrice singolare, perché si alterato alcuni parametri e non prevedere quello che sarebbe successo, eseguito in una sessione separata:

dos('matlab -automation -r &') 

È possibile ucciderlo senza dover riavviare l'intero Matlab.

1

Una soluzione che ho adottato - per l'uso con codice java, ma il concetto è lo stesso con mexFunctions, solo messier - è quello di restituire un valore FutureValue e quindi loop mentre FutureValue.finished() o qualsiasi cosa restituisce true. Il codice effettivo viene eseguito in un altro thread/processo. Avvolgendo una prova, prendi nota di ciò e un FutureValue.cancel() nel blocco catch funziona per me.

Nel caso di funzioni mex, è necessario restituire il valore di puntatore (come int) che punta a una struttura/oggetto che ha tutti i dati necessari (gestore thread nativo, bool completo ecc.). Nel caso di un built in mexFunction, il tuo mexFunction molto probabilmente avrà bisogno di chiamare quel mexFunction nel thread separato. Le funzioni Mex sono solo DLL/oggetti condivisi dopo tutto.

pseudocodice

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

Sembra che sia qualcosa di cui ho bisogno. Tuttavia, questa funzione si chiama mexCancel, come sarebbe quella? – patrik

+0

@ patrik Questo dipende interamente da come si presenta il tuo lungo processo. Essenzialmente, cancel, isdone e longprocess dovrebbero essere tutti scritti in c per funzionare insieme, esportati in una DLL, e poi le funzioni di mess scritte per chiamare quelle funzioni. Non è facile né pulito né ci sarà un codice generale. – KitsuneYMG

+0

Grazie per la risposta. Questo sembra un po 'scoraggiante, ma in ogni caso, se questo risultato fosse raggiunto, è certamente una soluzione di bellezza. – patrik

0

se si esegue il MATLAB su Linux, è possibile terminare il MATLAB con il comando in linux consule. prima si dovrebbe trovare il numero PID di MATLAB da questo codice:

superiore

quindi è possibile utilizzare questo codice per uccidere MATLAB: uccidere

esempio: uccidere 58056

5

Se ctrl + c non risponde subito perché il tuo script è troppo lungo/complesso, tienilo.

Il comando break non viene eseguito quando matlab esegue alcuni dei suoi script più profondi e non registra una sequenza di ctrl nel buffer, oppure cancella il buffer appena prima o appena dopo il completamento di quei pezzi di codice. In entrambi i casi, quando Matlab ritorna per eseguire più script, riconoscerà che stai tenendo premuto ctrl + c e termina.

Per programmi di esecuzione più lunghi, di solito cerco di trovare un buon posto per fornire un aggiornamento di stato e lo accompagno sempre con una certa misura di tempo usando tic e toc. A seconda di quello che sto facendo, potrei usare fase di esecuzione, il segmento di tempo, una sorta di media, ecc ...

Per i programmi in esecuzione davvero lunghe, ho trovato questo per essere eccezionalmente utile http://www.mathworks.com/matlabcentral/fileexchange/16649-send-text-message-to-cell-phone/content/send_text_message.m

ma sembra che abbiano anche alcune nuove funzioni per questo.

1

Dato che hai citato Task Manager, immagino che stai usando Windows. Supponendo che si sta eseguendo lo script all'interno dell'editor, se non si oppongono a smettere l'editor, allo stesso tempo, come l'uscita dal programma in esecuzione, la scorciatoia da tastiera per terminare un processo è:

Alt +F4

(e con questo intendo premere i tasti 'F4' sulla tastiera 'Alt' e simultaneamente.)

in alternativa, come detto in altre risposte,

Ctrl + C

dovrebbe funzionare, ma non uscire dall'editor.

Problemi correlati