Развернуть файл 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
%]
У исполняемого файла нет возвращаемого значения, вам нужно найти другой способ передачи данных обратно, например, через выходные данные консоли или текстовые файлы. То, что вы получите, это код ошибки и сообщение об ошибке.