En gros, j'ai un fichier m
qui ressemble à
function Z=myfunc()
% Do some calculations
dlmwrite('result.out',Z,',');
end
Je veux juste l'exécuter à partir de la ligne de commande sans entrer dans MATLAB. J'ai essayé plusieurs options (-nodisplay
, -nodesktop
, -nojvm
, -r
, etc.), aucun d'entre eux n'a fonctionné. Je finis par entrer dans MATLAB et je dois taper "quitter" pour quitter.
Quelle est la solution?
MATLAB peut exécuter des scripts, mais pas des fonctions à partir de la ligne de commande. C'est ce que je fais:
Fichier 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
Appelez-le en entrant:
./matlab_batcher.sh myfunction myinput
Utilisation:
matlab -nosplash -nodesktop -logfile remoteAutocode.log -r matlabCommand
Assurez-vous que matlabCommand
a une sortie comme dernière ligne.
Vous pouvez appeler des fonctions comme celle-ci:
matlab -r "votreFonction (0)"
Voici une solution simple que j'ai trouvée.
J'ai une fonction func (var) que je voulais exécuter à partir d'un script Shell et lui passer le premier argument pour var. Je mets cela dans mon script Shell:
matlab -nodesktop -nosplash -r "func('$1')"
Cela a fonctionné comme un régal pour moi. L'astuce est que vous devez utiliser des guillemets doubles avec la commande "-r" pour MATLAB et utiliser des guillemets simples afin de passer l'argument bash à MATLAB.
Assurez-vous simplement que la dernière ligne de votre script MATLAB est "exit" ou que vous exécutez
matlab -nodesktop -nosplash -r "func('$1'); exit"
Vous pouvez exécuter une fonction arbitraire à partir de la ligne de commande en passant une commande à Matlab, comme ceci:
matlab -nodisplay -r "funcname arg1 arg2 arg3 argN"
Cela exécutera la commande Matlab funcname('arg1', 'arg2', 'arg3', 'argN')
. Ergo, tous les arguments seront passés sous forme de chaînes et votre fonction doit gérer cela, mais là encore, cela s'applique également aux options de ligne de commande dans tout autre langage.
Nohup matlab -nodisplay -nodesktop -nojvm -nosplash -r script.m > output &
Vous pouvez compiler myfile
dans un programme autonome et l'exécuter à la place. Utilisez le compilateur de Matlab mcc
pour cela (si vous l'avez), plus d'informations sont fournies dans cette question .
Cette réponse a été copiée de ma réponse à ne autre question .
J'ai modifié la réponse d'Alex Cohen pour mes propres besoins, alors la voici.
Mes exigences étaient que le script batcher puisse gérer les chaînes et les entrées entières/doubles, et que Matlab devrait s'exécuter à partir du répertoire à partir duquel le script batcher a été appelé.
#!/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
Ce script peut être appelé comme (s'il se trouve sur votre chemin): matlab_batcher.sh functionName stringArg1 stringArg2 1 2.0
Où, les deux derniers arguments seront transmis sous forme de nombres et les deux premiers sous forme de chaînes.