support logo icon how from matlab command-line-arguments matlab-deployment matlab-compiler

logo - ¿Cómo puedo pasar los argumentos de la línea de comandos a un ejecutable independiente de MATLAB que se ejecuta en Linux/Unix?



matlab linux (3)

El sitio web de MATLAB tiene un ejemplo detallado con instrucciones sobre cómo compilar una aplicación simple y cómo implementarla en otra computadora. Básicamente, debe instalar MATLAB Compiler Runtime junto con su aplicación; el instalador para el tiempo de ejecución ya debería estar presente en su instalación del compilador MATLAB.

Para pasar argumentos de línea de comandos a un ejecutable MATLAB, se define una sola función MATLAB en el ejecutable: los argumentos para la función se toman de los parámetros de la línea de comando (el primer parámetro de la línea de comando es el primer argumento, y así sucesivamente).

Por ejemplo, cree un archivo echo.m con los siguientes contenidos:

function exitcode = echo(a, b) display(a); display(b); exitcode = 0;

A continuación, puede compilar este archivo y ejecutarlo con echo 1 2 3 , e imprimirá a=1 b=2 .

Tenga en cuenta que, cuando los argumentos se toman desde la línea de comando, se pasan a la función como cadenas , por lo que debe convertirlos en números usando la función str2num . Por ejemplo:

function rc = display_product(a, b) a = str2num(a); b = str2num(b); display(a*b); rc = 0;

¿Cómo puedo pasar los argumentos de la línea de comando a un ejecutable independiente de MATLAB que se ejecuta en Linux / UNIX?

Necesito compilar mi script MATLAB como un archivo independiente que se puede ejecutar en una máquina sin MATLAB presente. Necesita poder funcionar de forma similar a C argv[] , donde se hace lo siguiente:

Línea de comando:

myfile argument1.txt argument2.txt

donde los argumentos 1 y 2 son los archivos de entrada y salida.

La sintaxis exacta no importa, pero debería funcionar como argv[] . ¿Cuál es una función que podría hacer esto?

Lo que quiero decir es que tengo MATLAB en mi computadora, pero necesito hacer un ejecutable independiente que pueda ejecutarse en sistemas Unix SIN MATLAB en esas computadoras (es un clúster, que solo tiene MATLAB en un nodo). Necesito encontrar una manera de hacer la función varargin sin tener MATLAB instalado en la computadora que ejecuta el programa. Si puedo decirle a MATLAB que coloque la biblioteca MATLAB en cada ejecutable, está bien, siempre que sea un paquete independiente completo.


Realmente no puedes ejecutar MATLAB en una computadora sin MATLAB. Puede instalar MCR (MATLAB Component Runtime), que es de instalación gratuita, y ejecutar programas MATLAB. Para compilar un ejecutable ''independiente'' también necesitará el compilador MATLAB.

Una vez que tienes todo eso. MATLAB tiene todas las facilidades que necesita para manejar los argumentos de la línea de comandos de la manera que lo requiera.


Tuve el mismo problema y busqué una solución genérica al problema que en un script, los argumentos se pasan como cadenas, pero se necesitan como escalares o vectores. Supongamos que tiene la siguiente función

function myfunc(arg1, arg2, varargs) end

y quizás quieras poder llamarlo así

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

y también me gusta

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

para que pueda compilarlo y usarlo en la línea de comando como

myfunc 1 ''[1 2 3]'' optional1 2

Para esto, escribí la siguiente función:

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

Entonces puedo usar inputParser en myfunc esta manera:

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;

Como no encontré una forma lista para hacerlo, publico esta solución aquí y espero que también sea útil para otros. Si hay una mejor manera de lograr esto, házmelo saber.