Я хочу развернуть m-файл в исполняемый файл. Я использую команду mcc: mcc -m epidemic.m. Эпидемия - это моя функция, которая не принимает аргументов, возвращает вектор и записывает этот вектор в txt. Mcc создает epidemic.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
%]
EXE не имеет возвращаемого значения, вам нужно найти другой способ передачи данных обратно, например, через выходы консоли или текстовые файлы. Вы получите код ошибки и сообщение об ошибке.
Похожие вопросы
Новые вопросы
matlab
MATLAB - это высокоуровневая языковая и интерактивная среда программирования для численных расчетов и визуализации, разработанная MathWorks. Не используйте оба тега [matlab] и [octave], если явно не задан вопрос о сходстве или различии между ними. При использовании этого тега, пожалуйста, укажите версию MATLAB, с которой вы работаете (например, R2017a).