2010-01-04 5 views
30

Fondamentalement, j'ai un fichier m qui ressemble àComment appeler les fonctions MATLAB à partir de la ligne de commande Linux?

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'eux n'a fonctionné. Je finis par entrer dans MATLAB et dois taper "quitter" pour sortir.

Quelle est la solution?

+1

De MathWorks: [Comment exécuter Matlab en mode batch sur une machine UNIX? ] (http://www.mathworks.com/support/solutions/en/data/1-15HNG/index.html) –

Répondre

25

MATLAB peut exécuter des scripts, mais pas de 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 

appel en entrant:

./matlab_batcher.sh myfunction myinput 
+0

Quelle est l'entrée ici ??? – ablimit

+0

Ce que j'ai fait est juste: matlab -nojvm -nodisplay -nosplash /dev/null 2>/dev/null Quoi qu'il en soit, il affiche un message d'erreur, mais le résultat est correct. – ablimit

+0

Oui! Ça a marché. Merci Alex! – ablimit

20

Utilisation:

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

Assurez-vous matlabCommand a une sortie comme dernière ligne.

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

Pourquoi '-nojvm'? Je pourrais avoir besoin des fonctions 'java'. – gerrit

12

Vous pouvez appeler des fonctions comme ceci:

Matlab -r "yourFunction (0)"

+0

l'entrée peut-elle être donnée dans ces accolades? –

+2

Faites le '' matlab -r "func (arg1, arg2, ..); quittez" '' si vous ne voulez pas que MATLAB reste après l'exécution de la fonction. – nimrodm

0

Vous pourriez compiler myfile dans un programme autonome et exécuter qu'au lieu. Utilisez le compilateur Matlab mcc pour cela (si vous l'avez), plus d'informations sont fournies dans ce question.

Cette réponse a été copiée à partir de ma réponse à another question.

3

Vous pouvez exécuter une fonction arbitraire 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 en tant que chaînes et votre fonction doit gérer cela, mais là encore, cela s'applique également aux options de ligne de commande dans n'importe quelle autre langue.

0

J'ai modifié la réponse d'Alex Cohen pour mes propres besoins, alors voila. Mes conditions étaient que le script de batcher puisse manipuler la chaîne et les entrées entières/doubles, et que Matlab devrait courir du répertoire à partir duquel le script de batcher a été appelé.

#!/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 

Ce script peut être appelé comme (si elle est sur votre chemin): matlab_batcher.sh functionName stringArg1 stringArg2 1 2.0

Où, les deux derniers arguments seront passés en chiffres et les deux premières sous forme de chaînes.

7

Voici une solution simple que j'ai trouvée.

J'ai une fonction func (var) que je voulais lancer à 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 avec la commande "-r" pour MATLAB et utiliser des guillemets simples afin de passer l'argument bash à MATLAB.

Assurez-vous que la dernière ligne de votre script MATLAB est « sortie » ou que vous exécutez

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

Notez que, au moins dans ma configuration, l'utilisation de guillemets simples autour de $ 1 passe dans la variable d'environnement sous la forme d'une chaîne, et l'utilisation de guillemets autour de $ 1 le passe en nombre. De plus, dans ma configuration, si func est un fichier .m de fonction, vous n'avez pas besoin de mettre exit dans les guillemets doubles. – Grittathh

Questions connexes