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

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

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

1
Jose Ramon 29 Янв 2015 в 13:32

2 ответа

Лучший ответ

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

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

В автономный режим (mcc -m epidemeic.m) Matlab каким-то образом создает следующий псевдокод и компилирует его в .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.
}

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

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

  • [Простое решение] . Сохраните выходные данные в файлы или отобразите их в консоли оболочки с помощью disp (NB: вы можете использовать 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
%] 
3
CitizenInsane 3 Фев 2015 в 15:06

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

3
Daniel 29 Янв 2015 в 11:45