Разверните файл Matlab в исполняемый файл

Я хочу развернуть файл m в исполняемый файл. Я использую команду mcc: mcc -m epic.m. Эпидемия — это моя функция, которая не принимает аргументов, возвращает вектор и записывает этот вектор в txt. Mcc создает epic.exe, и когда я запускаю этот exe, он создает файл txt, однако кажется, что он не возвращает значения (возвращаемое значение .exe). Я пытаюсь запустить exe из Matlab, используя:

cmd = ['epidemic.exe '];
system(cmd);

Он возвращает cmdout "и статус 0. Как я могу получить возвращаемые значения .exe?


person Jose Ramon    schedule 29.01.2015    source источник


Ответы (2)


Когда вы компилируете код Matlab, например:

function [out1, out2] = epidemic(in1, in2, in3)
%[
    ...
%]

в автономный (mcc -m epidemeic.m), Matlab каким-то образом создает следующий псевдо-C-код и компилирует его в .exe:

int main(int argc, char** argv)
{
     // Load compiled code produced by mcc
     HMCRInstance* hInst = loadByteCodeProducedByMccFromResources();

     // Similar to have wrote in matlab "epidemic(argv[0], argv[1], ...)"
     // 1) Without asking for any argument output
     // 2) Argument inputs are passed as strings
     int errorCode = mclFevalFromExeArg(hInst, "epidemic", argc, argv);

     return errorCode; // only indicates if call to 'mclFEvalFromExeArg'
                       // succeded, it does not relate to out1, out2 at all.
}

Примечание: если вы хотите увидеть точный код, созданный mcc, используйте mcc -W main -T codegen epidemic.m

Таким образом, при прямой компиляции в автономный режим вы не можете работать с выводами вашей функции Matlab. Если вам нужно поиграть с выходными аргументами epidemic, либо

  • [Простое решение] Попробуйте сохранить выходные данные в файлы или отобразить их в консоли оболочки с помощью disp (примечание: вы можете использовать isdeployed в своем .m-файле, чтобы проверить, работаете ли вы из Matlab или из скомпилированного кода) .

  • [Расширенное решение] Попробуйте скомпилировать код в общую библиотеку (mcc -l epidemic.m), а не в автономную (mcc -m epidemeic.m)

NB: когда вы компилируете свой код в разделяемую библиотеку, mcc создаст dll, которая экспортирует следующую функцию:

extern LIB_epidemeic_C_API 
bool MW_CALL_CONV mlxEpidemic(int nlhs, mxArray *plhs[], int nrhs, mxArray *prhs[]);

nrhs/prhs — количество входных аргументов и их значений (как тип mxArray). А nlhs/plhs — это выходные аргументы, которые вы хотите иметь при вызове epidemic. Вы должны выполнить маршалинг между mxArray и эквивалентным собственным типом C.

ИЗМЕНИТЬ

Поскольку вы указываете, что epidemic возвращает вектор значений, вы можете отображать их из автономного режима следующим образом:

function [output] = epidemic(v1, v2, v3)
%[
    % When called from system cmd line, v1, v2, v3 are passed
    % as string. Here is how to convert them to expected type if required
    if (ischar(v1)), v1 = str2double(v1); end
    if (ischar(v2), v2 = str2double(v2); end
    if (ischar(v3)), v3 = str2double(v3); end

    ...
    output = ...;
    ...

    if (isdeployed())
        disp(output);  
    end
%] 
person CitizenInsane    schedule 30.01.2015
comment
У меня возникли проблемы с созданием библиотеки, поэтому я решил решить проблему с исполняемым файлом. Я записал вывод в текстовые файлы. Что мне делать для случая ввода? Можно ли взять в качестве аргумента вход функции Matlab? - person Jose Ramon; 03.02.2015
comment
Опять же, да ... если вы пишете в системной консоли epidemic.exe riri fifi loulou, это точно так же, как если бы вы написали в matlab promt epidemic('riri', 'fifi', 'loulou') ... Все аргументы передаются в виде строки, при необходимости вы можете преобразовать их в начале функции, используя ischar ... смотрите обновления в моем ответе. - person CitizenInsane; 03.02.2015

exe не имеет возвращаемого значения, вам нужно найти другой способ передачи данных обратно, например, через вывод консоли или текстовые файлы. Вы получаете код ошибки и сообщение об ошибке.

person Daniel    schedule 29.01.2015
comment
Как я могу перенести наши данные на вывод консоли? - person Jose Ramon; 29.01.2015
comment
Более того, можно ли ввести мою функцию Matlab с терминала? Если у меня есть входной аргумент для моего файла .m, могу ли я анализировать их с терминала, когда я вызываю развернутый .exe? - person Jose Ramon; 29.01.2015
comment
Аргументы .exe передаются в .m файл в виде строк. Вы можете добавить преобразование в начале вашего файла .m (например, if ischar(param1), param1 = str2num(param1); end), чтобы получить правильный тип на стороне Matlab. - person CitizenInsane; 29.01.2015
comment
Например, у меня есть следующая функция, которую я хочу развернуть в .exe. конечная функция = эпидемия (str1, str2, str3). Если ввод m файлов является строкой, он должен работать? - person Jose Ramon; 29.01.2015