将matlab文件部署到可执行文件

将matlab文件部署到可执行文件,matlab,exe,mcc,Matlab,Exe,Mcc,我想将m文件部署到可执行文件中。我正在使用mcc命令:mcc-m.m。流行病是我的函数,它不带参数,返回一个向量并将该向量写入txt。Mcc创建epostive.exe,当我运行该exe时,它会创建txt文件,但它似乎没有返回.exe的返回值。我正在尝试使用以下方法从matlab运行exe: cmd = ['epidemic.exe ']; system(cmd); 它返回cmdout,状态为0。如何获取.exe的返回值?如果exe没有返回值,则需要找到另一种方法将数据传输回来,例如通过控制台

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

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

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

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

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

当您编译如下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-wmain-tcodegen.m

因此,直接编译为单机版时,无法使用Matlab函数的输出。如果您需要处理流行病的输出参数

(简单的解决方案)考虑将输出保存到文件中,或者使用DISNB将其显示到shell控制台:可以在.m文件中使用ISP来检查您是从Matlab还是从编译代码运行。

[高级解决方案]考虑编译您的代码到共享库MCC-L流行病。M代替独立MCC-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是调用流行病时希望具有的输出参数。mxArray和等效的C本机类型之间的封送处理由您决定

编辑

当您指示流行病返回一个值向量时,您可以从单机版显示它们,如下所示:

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

当您编译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-wmain-tcodegen.m

因此,直接编译为单机版时,无法使用Matlab函数的输出。如果您需要处理流行病的输出参数

(简单的解决方案)考虑将输出保存到文件中,或者使用DISNB将其显示到shell控制台:可以在.m文件中使用ISP来检查您是从Matlab还是从编译代码运行。

[高级解决方案]考虑编译您的代码到共享库MCC-L流行病。M代替独立MCC-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是调用流行病时希望具有的输出参数。mxArray和等效的C本机类型之间的封送处理由您决定

编辑

当您指示流行病返回一个值向量时,您可以从单机版显示它们,如下所示:

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

如何将数据传输到控制台输出?此外,是否可以从终端向我的matlab函数提供输入?如果我的.m文件有输入参数,我可以在调用部署的.exe时从终端解析它们吗?将.exe的参数作为字符串传递到.m文件。您可以在.m文件的开头添加转换,例如,如果ischarparam1,param1=str2numparam1;结束以在matlab端获得正确的类型。最终功能=流行性STR1、str2、str3。若m文件的输入是字符串,那个么它应该工作?我如何将数据传输到控制台输出?此外,是否可以从终端向我的matlab函数提供输入?如果我的.m文件有输入参数,我可以在调用部署的.exe时从终端解析它们吗?将.exe的参数作为字符串传递到.m文件。您可以在.m文件的开头添加转换,例如,如果ischarparam1,param1=str2numparam1;结束以在matlab端获得正确的类型。最终功能=流行性STR1、str2、str3。如果m文件的输入是字符串,它应该工作吗?我在创建lib时遇到了问题,因此我决定了可执行文件的解决方案。我把输出写在文本文件中。我应该为输入案例做什么?是否可以将matlab函数的输入作为参数?同样,是的。。。如果您在system console Epilotion.exe riri fifi loulou上编写,则与在matlab promt Epilot'riri',fifi',loulou'上编写的完全相同。。。所有参数都作为字符串传递,i
如果需要,您可以在函数开始时使用ischar。。。请参阅我答案中的更新。我在创建lib时遇到了一些问题,因此我决定采用可执行文件的解决方案。我把输出写在文本文件中。我应该为输入案例做什么?是否可以将matlab函数的输入作为参数?同样,是的。。。如果您在system console Epilotion.exe riri fifi loulou上编写,则与在matlab promt Epilot'riri',fifi',loulou'上编写的完全相同。。。所有参数都作为字符串传递,如果需要,可以在函数开头使用ischar转换它们。。。请参阅我的答案中的更新。