Matlab: esecuzione di un file m dalla riga di comando


106

Supporre che;

Ho un file m nella posizione:
C:\M1\M2\M3\mfile.m

E il file exe del matlab si trova in questa posizione:
C:\E1\E2\E3\matlab.exe

Voglio eseguire questo m-file con Matlab, dalla riga di comando, ad esempio all'interno di un file .bat. Come posso farlo, c'è un modo per farlo?


Risposte:


106

Un comando come questo esegue correttamente il file m:

"C:\<a long path here>\matlab.exe" -nodisplay -nosplash -nodesktop -r "run('C:\<a long path here>\mfile.m'); exit;"


Un'altra domanda simile è qui per rispondere: stackoverflow.com/questions/25102699/…
Eghbal

6
Sarebbe utile se aggiungi il comando "exit" alla fine per rendere la tua risposta più pratica e utile.
Kamran Bigdely

3
Le virgolette singole e doppie dentro e intorno al comando "run" sono importanti!
Kamran Bigdely

5
E se volessi passare argomenti?

La versione di Windows supporta l'opzione -nodesktop? Ho pensato di no, ma potrebbe essere sbagliato.
Terje Sandstrøm

70

Penso che un punto importante che non è stato menzionato nelle risposte precedenti è che, se non esplicitamente indicato, l'interprete matlab rimarrà aperto. Pertanto, alla risposta di @hkBattousai aggiungerò il exitcomando:

"C:\<a long path here>\matlab.exe" -nodisplay -nosplash -nodesktop -r "run('C:\<a long path here>\mfile.m');exit;"


7
Per qualche motivo se si mfile.mattiva un errore la exitfunzione esplicita non viene mai chiamata, facendo attendere l'intero processo ...
malat

41

Ecco cosa userei invece, per gestire con garbo gli errori dallo script:

"C:\<a long path here>\matlab.exe" -nodisplay -nosplash -nodesktop -r "try, run('C:\<a long path here>\mfile.m'), catch, exit, end, exit"

Se vuoi più verbosità:

"C:\<a long path here>\matlab.exe" -nodisplay -nosplash -nodesktop -r "try, run('C:\<a long path here>\mfile.m'), catch me, fprintf('%s / %s\n',me.identifier,me.message), end, exit"

Ho trovato il riferimento originale qui . Poiché il collegamento originale è ora scomparso, ecco il collegamento a un nuovo lettore alternativo ancora attivo oggi:


26

Su Linux puoi fare lo stesso e puoi effettivamente rimandare alla shell un codice di errore personalizzato, come il seguente:

#!/bin/bash
matlab -nodisplay -nojvm -nosplash -nodesktop -r \ 
      "try, run('/foo/bar/my_script.m'), catch, exit(1), end, exit(0);"
echo "matlab exit code: $?"

stampa matlab exit code: 1se lo script genera un'eccezione, matlab exit code: 0altrimenti.


3
Per visualizzare l'errore come farebbe MATLAB quando non lo "try, run('/foo/bar/my_script.m'), catch e, disp(getReport(e)), exit(1), end, exit(0);"
rileva

13

Ecco i passaggi:

  1. Avvia la riga di comando.
  2. Entra nella cartella contenente il file .m con cd C:\M1\M2\M3
  3. Eseguire quanto segue: C:\E1\E2\E3\matlab.exe -r mfile

I sistemi Windows useranno la cartella corrente come posizione in cui MATLAB cerca i file .m e l' -ropzione tenta di avviare il file .m specificato non appena si verifica l'avvio.


1
Non verrà eseguito all'interno di un file .bat. L'ho dato come esempio. In realtà, lo eseguirò dalla funzione API Win32 CreateProcessW().
hkBattousai


8

Grazie a Malat. Il tuo commento mi ha aiutato. Ma voglio aggiungere il mio blocco try-catch, poiché ho trovato il MExeptionmetodo getReport()che restituisce l'intero messaggio di errore e lo stampa sulla console Matlab.

Inoltre ho stampato il nome del file poiché questa compilation fa parte di uno script batch che chiama matlab.

try
    some_code
    ...
catch message
    display(['ERROR in file: ' message.stack.file])
    display(['ERROR: ' getReport(message)])
end;

Per un nome di modello falso passato al metodo di generazione del codice legacy, l'output sarebbe simile a:

ERROR in file: C:\..\..\..
ERROR: Undefined function or variable 'modelname'.

Error in sub-m-file (line 63)
legacy_code( 'slblock_generate', specs, modelname);

Error in m-file (line 11)
sub-m-file

Error in run (line 63)
evalin('caller', [script ';']);

Infine, per visualizzare l'output nella finestra del prompt dei comandi di Windows, è sufficiente registrare la console Matlab in un file con -logfile logfile.txt(utilizzare in aggiunta -wait) e chiamare il comando batchtype logfile.txt


4

Dal R2019b, c'è una nuova opzione riga di comando, -batch. Sostituisce -r, che non è più consigliato. Unifica anche la sintassi tra le piattaforme. Vedi ad esempio la documentazione per Windows , per le altre piattaforme la descrizione è identica.

matlab -batch "statement to run"

Ciò avvia MATLAB senza il desktop o la schermata iniziale, registra tutto l'output su stdoute stderr, esce automaticamente al termine dell'istruzione e fornisce un codice di uscita che segnala il successo o l'errore.

Non è quindi più necessario utilizzare try/ catchintorno al codice da eseguire e non è più necessario aggiungere exitun'istruzione.


2

Eseguo questo comando all'interno di uno script bash, in particolare per inviare lavori SGE e cose di processo batch:

/Path_to_matlab -nodisplay -nosplash -nodesktop < m_file.m

0

Poiché nessuna delle risposte contiene informazioni sull'alimentazione dell'argomento di input, è importante aggiungerla qui. Dopo alcune ricerche, ho trovato questo collegamento

Il feed degli argomenti è molto simile a come eseguiamo una funzione Matlab.

matlab -r 'try myfunction(argument1,argument2); catch; end; quit'

Se in qualche modo stai ricevendo un argomento da bash / terminal, devi semplicemente inserirlo nel comando bash come:

matlab -r 'try myfunction($MY_BASH_ARG,argument2); catch; end; quit'

(Questo è dopo un paio di tentativi ed errori)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.