2009-10-05 8 views
14

Voglio chiamare matlab in bash in modo non interattivo e utilizzare il suo risultato all'esterno di Matlab.sopprime il messaggio di avvio di Matlab

Per esempio, ho un test.m sceneggiatura

rand(3,4) 
quit 

Quando eseguo in bash

$ matlab -nosplash -nodesktop -nodisplay -r test 
Warning: No window system found. Java option 'MWT' ignored 

         < M A T L A B (R) > 
       Copyright 1984-2008 The MathWorks, Inc. 
        Version 7.7.0.471 (R2008b) 
         September 17, 2008 


    To get started, type one of these: helpwin, helpdesk, or demo. 
    For product information, visit www.mathworks.com. 


ans = 

0.8147 0.9134 0.2785 0.9649 
0.9058 0.6324 0.5469 0.1576 
0.1270 0.0975 0.9575 0.9706 

è possibile sopprimere il messaggio di avvio di Matlab e mostrare solo i risultati anche senza "ans =".

Nota Sto facendo una domanda generale non solo per questo esempio.

Grazie e saluti!

+0

In Octave è possibile utilizzare il flag '-q'. – sffc

risposta

9

È possibile utilizzare il comando Unix "tail + n" per rimuovere le prime n righe di output. Quell'intestazione assomiglia a 10 linee, quindi questo lo spoglierà.

$ matlab -nosplash -nodesktop -nodisplay -r test | tail +10 

Questo è un po 'fragile, però, dal momento avvertimenti (come che "nessun sistema finestra") avranno messo a nudo, e le dimensioni dell'intestazione varierà a seconda di cosa gli avvertimenti accadere (e questi avvertimenti sono la diagnostica utili). Inoltre, questo avviso potrebbe essere su STDERR invece di STDOUT, quindi "tail +9" potrebbe essere quello che ti serve.

Un approccio più robusto potrebbe essere quello di modificare lo script Matlab per scrivere in un file separato utilizzando fopen/fprintf/fclose. In questo modo l'intestazione, gli avvertimenti, gli errori, ecc. Di Matlab saranno separati dall'output formattato desiderato. Per ottenere l'output "disp" per andare a quell'handle di file separato, puoi catturarlo usando evalc. Il file di output potrebbe essere specificato utilizzando un argomento da test() nel messaggio -r e la variabile di env $$ (il PID del processo di bash) incorporata nel nome del file per evitare collisioni in un ambiente a più processi.

function test(ppid) 
outfile = sprintf('outfile-%d.tmp', ppid); 
fh = fopen(outfile, 'w'); 
myvar = rand(3,4); 
str = evalc('disp(myvar)'); 
fprintf(fh, '%s', str); 
fclose(fh); 

Per richiamarlo da bash, utilizzare questo modulo di chiamata. (Può essere problemi di sintassi minori qui, io non ho una scatola di Unix per testare in questo momento.)

% matlab -nosplash -nodisplay -r "test($$)" -logfile matlab-log-$$.tmp 

Diciamo che il vostro bash PID è 1234. Ora hai la tua uscita in outfile-1234. tmp e un log Matlab in matlab-log-1234.tmp. Attaccali in/tmp se non vuoi essere dipendente da pwd. È possibile estendere questo per creare più file di output da una singola chiamata MATLAB, risparmiando i costi di avvio se è necessario calcolare più cose.

+2

Se questo non è 'tail -n + 10', con un' -n'? – elaRosca

+1

Dipende dalla versione di 'tail'. La sintassi senza '-n' è una variante più vecchia e ancora supportata in alcuni punti, incluso OS X in cui lavoro. Lo uso perché sono pigro e abituato. Includere il '-n' lo renderebbe più portatile e probabilmente più leggibile. –

2

Si consiglia di salvare l'output in un file e quindi di leggere il file. Questo approccio è leggermente più complicato, ma meno fragile in quanto i formati cambiano, ecc. Ti dà molto più controllo. Troverai numerosi script sul Web per trasformare i file Matlab in una lingua host diversa.

Esempio:

A = randn(3, 2); 
save temp_output.mat A 
# Later, read temp_output.mat in whichever language you desire. 
2

Per sopprimere la visualizzazione di ans =, è possibile utilizzare la funzione di DISP:

disp(rand(3,4)); 

Per sopprimere quel primo messaggio di avviso, si può provare ad aggiungere l'opzione -nojvm a vedere se questo aiuta.

Per sopprimere tutto il resto, è possibile provare this solution da un thread di Newsgroup di MathWorks che risolve lo stesso problema.

+1

-nojvm non sopprime il messaggio di avvio, ad esempio " ..." – Tim

+0

@Tim: era un errore. Volevo suggerire che potrebbe essere d'aiuto con il messaggio di avvertimento. Lo aggiusterò. – gnovice

1

Calling MATLAB come questo

matlab -nodisplay <test.m &>matlab.output 

vi scaricare tutti i messaggi di avvio e altro output visualizzato nel file matlab.output (che può essere chiamato tutto quello che vuoi). Se poi (seguendo il suggerimento di Peter) ha test.m salvare il risultato che avete bisogno di un file utilizzando

csvwrite('temp_output.txt',A) 

o un'altra funzione di uscita appropriato si può quindi leggere in questo file e procedere.

11

Provare a utilizzare l'opzione di riga di comando -logfile:

-logfile log   - Make a copy of any output to the command window 
         in file log. This includes all crash reports. 

Quindi è possibile rimuovere facilmente le prime righe che utilizzano qualsiasi modo si desidera (sed per esempio).Esempio:

matlab.exe -nosplash -nodesktop -nojvm -logfile out.log -r 'rand(3,3), exit' 
sed '1,5d' out.log 

anche se si esegue da uno script in cui è necessario che finisca in esecuzione prima di continuare, utilizzare l'opzione -wait:

-wait  - MATLAB is started by a separate starter program 
      which normally launches MATLAB and then immediately 
      quits. Using the -wait option tells the starter 
      program not to quit until MATLAB has terminated. 
      This option is useful when you need to process the 
      the results from MATLAB in a script. The call to 
      MATLAB with this option will block the script from 
      continuing until the results are generated. 

Maggiori informazioni all'avvio MATLAB le opzioni possono essere trovate here o nelle pagine di riferimento eseguibili matlab: Windows/Unix

+0

Ulteriori informazioni sulle opzioni di avvio di MATLAB sono disponibili qui: http://www.mathworks.com/access/helpdesk/help/techdoc/index.html?/access/helpdesk/help/techdoc/matlab_env/f8-4994.html –

Problemi correlati