23

Comment passer des arguments de ligne de commande à un exécutable MATLAB autonome fonctionnant sous Linux/UNIX?Comment passer des arguments de ligne de commande à un exécutable MATLAB autonome fonctionnant sous Linux/Unix?

J'ai besoin de compiler mon script MATLAB sous la forme d'un fichier autonome qui peut être exécuté sur une machine sans MATLAB présent. Il doit être en mesure de travailler d'une manière similaire à C de argv[] où vous effectuez les opérations suivantes:

Ligne de commande:

myfile argument1.txt argument2.txt 

où l'argument 1 et 2 sont les fichiers d'entrée et de sortie.

La syntaxe exacte n'a pas d'importance, mais elle devrait fonctionner comme argv[]. Qu'est-ce qu'une fonction qui pourrait faire cela?


Ce que je veux dire est que j'ai Matlab sur mon ordinateur, mais je dois faire un exécutable autonome qui peut fonctionner sur les systèmes Unix SANS Matlab sur ces ordinateurs (il est un cluster, qui a seulement Matlab sur un nœud). Je dois trouver un moyen de rendre la fonction varargin sans avoir MATLAB installé sur l'ordinateur qui exécute le programme. Si je peux dire à MATLAB de mettre la bibliothèque MATLAB dans chaque exécutable, c'est OK, tant que c'est un paquet autonome complet.

Répondre

2

Vous ne pouvez pas vraiment exécuter MATLAB sur un ordinateur sans MATLAB. Vous pouvez installer le MCR (MATLAB Component Runtime), qui est gratuit à installer, et exécuter des programmes MATLAB. Pour construire un exécutable 'standalone', vous aurez également besoin du compilateur MATLAB.

Une fois que vous avez tout cela. MATLAB dispose de toutes les fonctionnalités dont vous avez besoin pour gérer les arguments de la ligne de commande de la manière dont vous le souhaitez.

20

Le site Web MATLAB a un worked-through example avec des instructions sur la façon de compiler une application simple et de la déployer sur un autre ordinateur. En substance, vous devez installer le MATLAB Compiler Runtime avec votre application; le programme d'installation pour l'exécution doit déjà être présent dans votre installation du compilateur MATLAB .

pour transmettre des arguments de ligne de commande à un exécutable MATLAB, on définit une seule fonction MATLAB dans l'exécutable: les arguments de la fonction sont prises à partir des paramètres de ligne de commande (le premier paramètre de ligne de commande est le premier argument , etc).

Par exemple, créez un fichier echo.m avec les contenu suivant:

function exitcode = echo(a, b) 

display(a); 
display(b); 

exitcode = 0; 

Vous pouvez ensuite compiler ce fichier et l'exécuter avec echo 1 2 3, et il imprimerez a=1 b=2.

Notez que, lorsque les arguments sont tirés de la ligne de commande, ils sont transmis à la fonction chaînes, donc vous devez les convertir en numéros en utilisant la fonction str2num.Par exemple:

function rc = display_product(a, b) 

a = str2num(a); 
b = str2num(b); 

display(a*b); 

rc = 0; 
+0

Qu'en est-il de la valeur retournée? – guilhermecgs

1

J'ai eu le même problème et cherché une solution générique au problème que dans un script, les arguments sont passés sous forme de chaînes, mais besoin comme vecteurs ou scalaires. Supposons que vous ayez la fonction suivante

function myfunc(arg1, arg2, varargs) 
end 

et vous voulez peut-être être en mesure de l'appeler comme

myfunc(1, [1 2 3], 'optional1', 2) 

et aussi comme

myfunc('1', '[1 2 3]', 'optional1', '2') 

afin que vous puissiez le compiler et l'utilisation sur la ligne de commande comme

myfunc 1 '[1 2 3]' optional1 2 

Pour cela, j'ai écrit la fonction suivante:

function r=evalArguments(parser, arguments) 
    % Evaluates parsed arguments' values. 
    % Given a parser containing parsed arguments, all string values of the 
    % arguments specified by parameter "arguments" are evaluated 
    % and the complete results is returned in a new struct. 

    r = parser.Results; 
    for j=1:length(arguments) 
     argValue = r.(arguments{j}); 
     if ischar(argValue) 
      r.(arguments{j}) = eval(argValue); 
     end 
    end 
end 

Je suis en mesure d'utiliser le inputParser dans myfunc comme ceci:

p = inputParser; 
p.addRequired('arg1'); 
p.addRequired('arg2'); 
p.addParameter('optional1', 0); 
p.parse(arg1, arg2, varargin{:}); 
nonStringArguments = {'arg1', 'arg2', 'optional1'}; 
args = evalArguments(p, nonStringArguments); 
... 
x = args.arg1; 
y = args.arg2; 
z = args.optional1; 

Comme je ne trouve pas hors-the Pour ce faire, je poste cette solution ici et j'espère qu'elle sera utile aux autres. S'il y a un meilleur moyen d'y parvenir, s'il vous plaît faites le moi savoir.

Questions connexes