2010-01-04 29 views
30

Básicamente tengo un archivo m que se parece a¿Cómo llamar a las funciones de MATLAB desde la línea de comandos de Linux?

function Z=myfunc() 
    % Do some calculations 
    dlmwrite('result.out',Z,','); 
end 

sólo quiero ejecutarlo desde la línea de comandos, sin entrar en MATLAB. Intenté varias opciones (-nodisplay, -nodesktop, -nojvm, -r, etc.), ninguna de ellas funcionó. Termino entrando en MATLAB y tengo que escribir "salir" para salir.

¿Cuál es la solución?

+1

De MathWorks: [¿Cómo se ejecuta en modo batch MATLAB en una máquina UNIX? ] (http://www.mathworks.com/support/solutions/en/data/1-15HNG/index.html) –

Respuesta

25

MATLAB pueden ejecutar scripts, pero no funciones de la línea de comandos. Esto es lo que hago:

Archivo matlab_batcher.sh:

#!/bin/sh 

matlab_exec=matlab 
X="${1}(${2})" 
echo ${X} > matlab_command_${2}.m 
cat matlab_command_${2}.m 
${matlab_exec} -nojvm -nodisplay -nosplash < matlab_command_${2}.m 
rm matlab_command_${2}.m 

llamada ingresando:

./matlab_batcher.sh myfunction myinput 
+0

¿Cuál es la entrada aquí? – ablimit

+0

Lo que hice es simplemente: matlab -nojvm -nodisplay -nosplash /dev/null 2>/dev/null De todos modos, se imprime un mensaje de error, pero el resultado es correcto. – ablimit

+0

¡Sí! Funcionó. Gracias Alex! – ablimit

20

Uso:

matlab -nosplash -nodesktop -logfile remoteAutocode.log -r matlabCommand 

Asegúrese matlabCommand tiene una salida como su última línea.

1
nohup matlab -nodisplay -nodesktop -nojvm -nosplash -r script.m > output & 
+1

¿Por qué '-nojvm'? Puede que necesite las funciones 'java'. – gerrit

12

Puede llamar a funciones como esto:

MATLAB -r "yourFunction (0)"

+0

¿se puede dar la entrada en esos apoyos? –

+2

Crea ese '' matlab -r "func (arg1, arg2, ..); sale" '' si no quieres que MATLAB se quede después de ejecutar la función. – nimrodm

0

Usted podría compilar myfile en un programa y ejecutan de forma autónoma en su lugar. Utilice el compilador de Matlab mcc para eso (si lo tiene), se proporciona más información en este question.

Esta respuesta fue copiada de mi respuesta a another question.

3

Puede ejecutar una función arbitraria de la línea de comandos mediante el paso de un comando de Matlab, así:

matlab -nodisplay -r "funcname arg1 arg2 arg3 argN" 

Esto ejecutará el comando Matlab funcname('arg1', 'arg2', 'arg3', 'argN'). Ergo, todos los argumentos se pasarán como cadenas y su función necesita manejar esto, pero de nuevo, esto se aplica a las opciones de línea de comandos en cualquier otro idioma también.

0

He modificado la respuesta de Alex Cohen para mis propias necesidades, así que aquí está.

Mis requisitos eran que el script del dosificador podía manejar cadenas y enteros/entradas dobles, y que Matlab debería ejecutarse desde el directorio desde el que se llamó el script del dosificador.

#!/bin/bash 

matlab_exec=matlab 

#Remove the first two arguments 
i=0 
for var in "[email protected]" 
do 
args[$i]=$var 
let i=$i+1 
done 
unset args[0] 

#Construct the Matlab function call 
X="${1}(" 
for arg in ${args[*]} ; do 
    #If the variable is not a number, enclose in quotes 
    if ! [[ "$arg" =~ ^[0-9]+([.][0-9]+)?$ ]] ; then 
    X="${X}'"$arg"'," 
    else 
    X="${X}"$arg"," 
    fi 
done 
X="${X%?}" 
X="${X})" 

echo The MATLAB function call is ${X} 

#Call Matlab 
echo "cd('`pwd`');${X}" > matlab_command.m 
${matlab_exec} -nojvm -nodisplay -nosplash < matlab_command.m 

#Remove the matlab function call 
rm matlab_command.m 

Este script puede ser llamado como (si es en su camino): matlab_batcher.sh functionName stringArg1 stringArg2 1 2.0

Cuando, serán pasados ​​los dos últimos argumentos como los números y los dos primeros como cadenas.

7

Aquí hay una solución simple que encontré.

Tengo una función func (var) que quería ejecutar desde un script de shell y pasarle el primer argumento para var. Puse esto en mi script de shell:

matlab -nodesktop -nosplash -r "func('$1')" 

Eso funcionó como un regalo para mí. El truco es que debe usar comillas dobles con el comando "-r" para MATLAB y usar comillas simples para pasar el argumento bash a MATLAB.

Sólo asegúrese de que la última línea de la secuencia de comandos de MATLAB es la "salida" o que ejecute

matlab -nodesktop -nosplash -r "func('$1'); exit" 
+0

Tenga en cuenta que, al menos en mi configuración, el uso de comillas simples alrededor de $ 1 pasa en la variable de entorno como una cadena, y al no usar comillas alrededor de $ 1, se transfiere como un número. Además, en mi configuración, si func es un archivo .m de función, no necesita colocar exit en las comillas dobles. – Grittathh

Cuestiones relacionadas