Подтвердить что ты не робот

Как передать аргументы командной строки автономному исполняемому файлу 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 в каждый исполняемый файл, это нормально, если это полный автономный пакет.

4b9b3361

Ответ 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;

Поскольку я не нашел готового способа сделать это, я размещаю это решение здесь и надеюсь, что он также может быть полезен другим. Если есть лучший способ достичь этого, сообщите мне.