1

我想将一个 m 文件部署到一个可执行文件中。我正在使用 mcc 命令:mcc -m流行病.m。Epidemic 是我的函数,它不带参数并返回一个向量并将该向量写入 txt。Mcc 创建流行病.exe,当我运行该 exe 时,它​​会创建 txt 文件,但它似乎没有返回值(.exe 的返回值)。我正在尝试使用以下命令从 matlab 运行 exe:

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

它返回 cmdout" 和状态 0。如何获取 .exe 的返回值?

4

2 回答 2

3

exe 没有返回值,您需要找到另一种方式来传输数据,例如通过控制台输出或文本文件。你得到的是错误代码和错误信息。

于 2015-01-29T11:45:39.860 回答
3

当你编译 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,要么

  • [简单解决方案]考虑使用将输出保存到文件或将它们显示到 shell 控制台disp(注意:您可以isdeployed在 .m 文件中使用以检查您是从 matlab 运行还是从编译代码运行)。

  • [高级解决方案]考虑将代码编译为共享库 ( mcc -l epidemic.m) 而不是独立库 ( mcc -m epidemeic.m)

注意:当您将代码编译到共享库时,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
%] 
于 2015-01-30T09:08:20.907 回答