Когда вы компилируете код 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