web-dev-qa-db-fra.com

Comment appeler les fonctions MATLAB à partir de la ligne de commande Linux?

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?

30
ablimit

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
25
Alex Cohen

Utilisation:

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

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

20
Douglas Forman

Vous pouvez appeler des fonctions comme celle-ci:

matlab -r "votreFonction (0)"

12
David Doria

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"
7
DML

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.

3
gerrit
Nohup matlab -nodisplay -nodesktop -nojvm -nosplash -r script.m > output &
1
Max

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 .

0
quazgar

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.

0
Steven