Comment puis-je passer des arguments de ligne de commande à un exécutable MATLAB autonome fonctionnant sous Linux/Unix?
Comment passer des arguments en ligne de commande à un exécutable MATLAB autonome fonctionnant sur Linux/UNIX?
je dois compiler mon script MATLAB comme un fichier autonome qui peut être exécuté sur une machine sans la présence de MATLAB. Il doit être capable de travailler d'une manière similaire à C argv[]
, où vous faites ce qui suit:
ligne de Commande:
myfile argument1.txt argument2.txt
où les arguments 1 et 2 sont les fichiers d'entrée et de sortie.
La syntaxe exacte n'a pas d'importance, mais il doit le travail de la forme argv[]
. Ce qui est une fonction qui pourrait faire cela?
ce que je veux dire, c'est que J'ai MATLAB sur mon ordinateur, mais j'ai besoin de faire un exécutable autonome qui peut fonctionner sur des systèmes Unix sans MATLAB sur ces ordinateurs (c'est un cluster, qui n'a MATLAB que sur un seul noeud). Je dois trouver un moyen de faire fonctionner varargin sans que MATLAB soit 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 bon, tant que c'est un paquet autonome complet.
3 réponses
le site de MATLAB dispose d'un travaillé, par exemple avec des instructions pour compiler une application simple et la déployer sur un autre ordinateur. En essence, vous avez besoin d'installer le L'exécution du compilateur MATLAB avec votre application; l'installateur pour l'exécution devrait déjà être présent dans votre compilateur MATLAB installation.
pour passer des arguments en ligne de commande à un exécutable MATLAB, vous définissez fonction MATLAB unique dans l'exécutable: les arguments à l' la fonction est prise à partir des paramètres de la ligne de commande (le premier paramètre de la ligne de commande est le premier argument, et ainsi de suite).
Par exemple, créer un fichier echo.m
avec les éléments suivants
contenu:
function exitcode = echo(a, b)
display(a);
display(b);
exitcode = 0;
Vous pouvez alors compiler ce fichier et de l'exécuter avec echo 1 2 3
, et il
imprime a=1 b=2
.
notez que, lorsque les arguments sont pris à partir de la ligne de commande, ils sont
passée à la fonction comme chaînes de caractères, donc vous devez les convertir en
nombre à l'aide de la str2num
fonction. Par exemple:
function rc = display_product(a, b)
a = str2num(a);
b = str2num(b);
display(a*b);
rc = 0;
vous ne pouvez pas vraiment exécuter MATLAB sur un ordinateur sans MATLAB. Vous pouvez installer le MCR (MATLAB Component Runtime), qui est libre d'installer, et exécuter les programmes MATLAB. Pour construire un exécutable "autonome", vous aurez également besoin du compilateur MATLAB.
une Fois que vous avez tout cela. MATLAB a toutes les facilités dont vous avez besoin pour gérer les arguments en ligne de commande de la façon dont votre require.
j'ai eu le même problème et j'ai cherché une solution générique au problème que dans un script, les arguments sont passés comme des chaînes, mais nécessaires comme des scalaires ou des vecteurs. Supposons que vous ayez la fonction suivante
function myfunc(arg1, arg2, varargs)
end
et peut-être vous voulez être en mesure de l'appeler comme
myfunc(1, [1 2 3], 'optional1', 2)
et
myfunc('1', '[1 2 3]', 'optional1', '2')
pour que vous puissiez le compiler et l'utiliser sur la ligne de commande comme
myfunc 1 '[1 2 3]' optional1 2
Pour cela, j'ai écrit ce qui suit fonction:
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
Ensuite, je suis en mesure d'utiliser le inputParsermyfunc
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 n'ai pas trouvé le moyen de le faire, je poste Cette solution ici et j'espère qu'elle pourra aussi être utile aux autres. S'il y a une meilleure façon d'y parvenir, veuillez me le faire savoir.