Как передать аргументы командной строки автономному исполняемому файлу MATLAB на linux/unix?
Как передать аргументы командной строки в автономный исполняемый файл MATLAB
работает в Linux/UNIX? Мне нужно скомпилировать мой MATLAB script как отдельный файл, который можно запустить на машине без присутствия matlab. Он должен работать так же, как C argv [], где вы делаете следующее:
КОМАНДНАЯ ЛИНИЯ:
myfile argument1.txt argument2.txt
где аргументы 1 и 2 являются входными и выходными файлами.
Точный синтаксис не имеет значения, но он должен работать как argv []. Мне действительно нужна помощь в этом. Функция, которая могла бы сделать это, была бы оценена.
Что я имею в виду, так это то, что у меня есть Matlab на моем компьютере, но мне нужно сделать автономный исполняемый файл, который может работать в UNIX-системах БЕЗ Matlab на этих компьютерах. (это кластер, который имеет только MATLAB на одном node). Мне нужно найти способ сделать функцию varargin без установки Matlab на компьютере, на котором запущена программа. Если я могу сказать, что Matlab помещает библиотеку matlab в каждый исполняемый файл, это нормально, если это полный автономный пакет.
Ответы
Ответ 1
На веб-сайте MatLab есть
проработанный пример
с инструкциями о том, как составить простое приложение и как
разверните его на другом компьютере. По сути, вам нужно установить
MatLab Compiler Runtime вместе с вашим приложением; установщик
поскольку среда выполнения должна присутствовать в вашем компиляторе MatLab
установка.
Чтобы передать аргументы командной строки исполняемому файлу MatLab, вы определяете
единственная функция MatLab в исполняемом файле: аргументы
функции берутся из параметров командной строки (1-й
параметр командной строки - это первый аргумент и т.д.).
Например, создайте файл echo.m
со следующим
содержание:
function exitcode = echo(a,b)
display(a);
display(b);
exitcode = 0;
Затем вы можете скомпилировать этот файл и запустить его с помощью echo 1 2 3
, и он
напечатает a=1 b=2
.
Обратите внимание, что когда аргументы берутся из командной строки, они
передаются функции как строки, поэтому вам нужно преобразовать их в
чисел с помощью функции str2num
. Например:
function rc = display_product(a,b)
a = str2num(a);
b = str2num(b);
display(a*b);
rc = 0;
Ответ 2
Вы не можете запустить Matlab на компьютере без Matlab. Вы можете установить MCR (Matlab Component Runtime), который можно установить и запустить программы Matlab. Для создания "автономного" исполняемого файла вам также понадобится компилятор Matlab.
Как только у вас есть все, что у Matlab есть все возможности, необходимые для обработки аргументов командной строки так, как вам нужно.
Ответ 3
У меня была та же проблема и поиск общего решения проблемы, что в script аргументы передаются как строки, но необходимы как скаляры или векторы.
Предположим, что у вас есть следующая функция
function myfunc(arg1, arg2, varargs)
end
и вы, возможно, захотите его называть как
myfunc(1, [1 2 3], 'optional1', 2)
а также как
myfunc('1', '[1 2 3]', 'optional1', '2')
чтобы вы могли скомпилировать его и использовать в командной строке, например
myfunc 1 '[1 2 3]' optional1 2
Для этого я написал следующую функцию:
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
Затем я могу использовать inputParser в myfunc
следующим образом:
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;
Поскольку я не нашел готового способа сделать это, я размещаю это решение здесь и надеюсь, что он также может быть полезен другим.
Если есть лучший способ достичь этого, сообщите мне.