tipos - ¿Cómo llamar a las funciones de MATLAB desde la línea de comandos de Linux?
subfunciones matlab (8)
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.
Solo asegúrate de que la última línea de tu script de MATLAB sea "exit" o que ejecutes
matlab -nodesktop -nosplash -r "func(''$1''); exit"
Básicamente tengo un archivo m
que se parece a
function Z=myfunc()
% Do some calculations
dlmwrite(''result.out'',Z,'','');
end
Solo quiero ejecutarlo desde la línea de comandos sin entrar en MATLAB. -nodesktop
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?
He modificado la respuesta de Alex Cohen para mis propias necesidades, así que aquí está.
Mis requisitos eran que el script del dosificador podrí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 "$@"
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 se puede llamar como (si está en su ruta): matlab_batcher.sh functionName stringArg1 stringArg2 1 2.0
Donde, los dos argumentos finales se pasarán como números y los dos primeros como cadenas.
Puede compilar mi myfile
en un programa independiente y ejecutarlo en su lugar. Utilice el compilador mcc
Matlab para eso (si lo tiene), se proporciona más información en esta question .
Esta respuesta fue copiada de mi respuesta a otra pregunta .
Puede ejecutar una función arbitraria desde la línea de comando pasando un comando a 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.
Puede llamar a funciones como esta:
matlab -r "yourFunction (0)"
Utilizar:
matlab -nosplash -nodesktop -logfile remoteAutocode.log -r matlabCommand
Asegúrese de que matlabCommand
tenga una salida como última línea.
MATLAB puede ejecutar scripts, pero no funciones desde 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
Llámalo ingresando:
./matlab_batcher.sh myfunction myinput
nohup matlab -nodisplay -nodesktop -nojvm -nosplash -r script.m > output &