2009-10-05 7 views
14

Quiero llamar a matlab in bash de forma no interactiva y usar su resultado fuera de Matlab.suprimir el mensaje de inicio de Matlab

Por ejemplo, tengo un guión test.m

rand(3,4) 
quit 

Cuando ejecuto en 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 

¿Es posible suprimir el mensaje de inicio de Matlab y sólo mostrar los resultados también sin "ans =".

Nota Estoy haciendo una pregunta general no solo para este ejemplo.

¡Gracias y saludos!

+0

En Octave puede usar el indicador '-q'. – sffc

Respuesta

9

Puede usar el comando de Unix "tail + n" para eliminar las primeras n líneas de salida. Ese encabezado se ve como 10 líneas, por lo que esto lo despojará.

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

esto es un poco frágil, sin embargo, ya advertencias (como que "ningún sistema de ventanas") conseguirán despojado, y el tamaño del encabezado variará dependiendo de qué suceden las advertencias (y esas advertencias son diagnósticos útiles). Además, esa advertencia podría estar en STDERR en lugar de STDOUT, por lo que "cola +9" podría ser lo que necesita.

Un enfoque más robusto podría ser modificar el script de Matlab para escribir en un archivo separado usando fopen/fprintf/fclose. De esta forma, el encabezado, las advertencias, los errores, etc. de Matlab se separarán de la salida formateada que desee. Para que la salida "disp" vaya a ese identificador de archivo separado, puede capturarlo usando evalc. El archivo de salida se podría especificar usando un argumento para probar() en el mensaje -r, y la variable $$ env (el PID del proceso de bash) incorporada en el nombre del archivo para evitar colisiones en un entorno de multiprocesos.

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); 

Para invocarlo desde bash, utilice este formulario de llamada. (Puede haber problemas de sintaxis menores aquí, no tengo una máquina Unix a prueba en este momento.)

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

Digamos que su golpe del PID es 1234. Ahora usted tienen su salida en archivo_salida-1234. tmp y un registro de Matlab en matlab-log-1234.tmp. Péguelos en/tmp si no quiere depender de pwd. Puede ampliar esto para crear múltiples archivos de salida desde una sola invocación de matlab, ahorrando los costos de inicio si necesita calcular varias cosas.

+2

¿No debería ser 'tail -n + 10', con' -n'? – elaRosca

+1

Depende de la versión de 'tail'. La sintaxis sin '-n' es una variante anterior, y todavía es compatible en algunos lugares, incluido OS X donde trabajo. Lo uso porque soy flojo y estoy acostumbrado. Incluir el '-n' lo haría más portátil y probablemente más legible. –

2

Recomendaría guardar la salida en un archivo, y luego leer en ese archivo. Este enfoque es un poco más complicado, pero menos frágil a medida que cambian los formatos, etc. Te da mucho más control. Encontrará muchos scripts en la web para transformar los archivos de Matlab en un idioma de host diferente.

Ejemplo:

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

para suprimir la presentación de ans =, puede utilizar la función DISP:

disp(rand(3,4)); 

Para suprimir ese primer mensaje de advertencia, puede intentar añadir en la opción -nojvm a ver si eso ayuda.

Para suprimir todo lo demás, puede probar this solution desde un subproceso de MathWorks Newsgroup que resuelve el mismo problema.

+1

-nojvm no suprime el mensaje de inicio, es decir, " ..." – Tim

+0

@Tim: Eso fue un error. Quise sugerir que podría ayudar con el mensaje de advertencia. Lo arreglaré. – gnovice

1

Calling MATLAB como esto

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

volcará todos los mensajes de inicio y otra de salida que se muestra en el archivo matlab.output (que puede ser cualquier nombre que desee). Si a continuación (siguiendo la sugerencia de Pedro) tiene test.m guardar el resultado de que es necesario un archivo usando

csvwrite('temp_output.txt',A) 

u otra función de salida apropiada a continuación, puede leer en este archivo y proceder.

11

intente usar la opción de línea de comandos -logfile:

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

Entonces usted puede quitar fácilmente las primeras líneas utilizando la forma que desee (sed por ejemplo).Ejemplo:

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

Además, si está ejecutando un guión donde se necesita que se termine de ejecutarse antes de continuar, utilice la opción -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. 

Más información en el inicio de MATLAB las opciones se pueden encontrar here, o en las páginas de referencia ejecutables matlab: Windows/Unix

+0

Más información sobre las opciones de inicio de MATLAB se puede encontrar aquí: http://www.mathworks.com/access/helpdesk/help/techdoc/index.html?/access/helpdesk/help/techdoc/matlab_env/f8-4994.html –

Cuestiones relacionadas