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

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

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

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

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
%] 

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

Другие вопросы по тегам