使用Matlab编译器将MATLAB .m文件转换为.mex文件

时间:2014-05-06 10:43:13

标签: c++ c matlab mex

我知道这可能是一个非常着名的主题,但我找不到任何可以帮助我的东西。

这是情景:

  1. 我有一个myFun.m函数,无论里面是什么,它都是一个通用函数,它可能依赖于其他工具箱。它有输入和输出;

  2. 我想生成类似的myFun.mex函数;

  3. 我有Matlab编译器,我可以将myFun.m编译为

    mcc -v -W lib:libmyFun -T link:lib myFun
    

    通过这种方式,我得到了一些新文件:

    libmyfun.c

    libmyfun.dll

    libmyfun.exp

    libmyfun.exports

    libmyfun.h

    libmyfun.lib

    阅读并关注Loren's example我想我必须创建一个myfun.cpp,里面包含着名的gateway function

    /* The gateway function */
    void mexFunction(int nlhs, mxArray *plhs[],
                     int nrhs, const mxArray *prhs[])
    {
    /* variable declarations here */
    
    /* code here */
    }
    

    我试过这样做并调用了mex生成例程:

    mex('-v', 'myfun.cpp')
    

    但我得到了几个错误,我必须说我的myfun.cpp是复制/粘贴功能,我对它有很多疑问......特别是在输入/输出管理方面。

    我的问题是......除了myfun.cpp函数之外,由于我不是C / C ++开发人员,因此可能会出错...这个过程是否正确? 如果答案是肯定的,那么有人知道哪个是写myfun.cpp的通用方法吗?

    干杯,

    塞巴斯蒂安

1 个答案:

答案 0 :(得分:3)

MATLAB编译器不能做你想做的事。

MATLAB编译器获取您的.m代码并加密并将其存档到.ctf(组件技术文件)文件中。然后它生成一个瘦包装器(.exe文件或.dll库文件以及文件,以便从C调用库。您将.ctf文件和包装器与可自由再分发的MCR(MATLAB编译器运行时)一起提供给最终用户。可以将前两个或全部三个打包成一个单元,以便于分发。

最终用户运行可执行文件或库,它可以对.m代码进行解密和解密,并针对MCR而不是MATLAB运行它。您可以将MCR视为基本上是MATLAB的副本,但没有前端桌面环境。

MATLAB编译器适用于您希望与没有MATLAB的人轻松共享MATLAB应用程序或算法的用例。由于代码已加密,您还可以使用它来保护您的知识产权。但是代码仍然是.m代码,并且完全像在MATLAB中一样执行,包括相同的速度。

MEX完全不同。如果你有一个用C代码实现的算法,你可以添加'网关'您提到它的例程,并使用命令mex将其编译到一个库中,然后可以从MATLAB中调用它,就像它是一个常规的MATLAB命令或函数一样。 MEX功能是常规MATLAB的一部分,并不需要任何附加产品。

还有另一个产品MATLAB Coder,它与MATLAB Compiler不同。

MATLAB Coder采用MATLAB语言子集中的.m代码,并将其转换为C代码。该子集非常广泛,但对支持的MATLAB语言部分有一些重要的限制。我担心这些限制包括许多工具箱功能,包括神经网络工具箱的一些功能。

然后,您可以使用该C代码执行大量操作,包括使用MEX将其编译回可用作MATLAB命令的表单。这通常(尽管不总是)提供了比原始.m代码更快的速度。您还可以执行其他操作,例如将C代码集成到更广泛的C项目中。或将其交付给嵌入式设备。

您的问题的主要答案是:

  1. MATLAB编译器无法满足您的需求。
  2. 要从.m代码生成MEX文件文件,请手动将其重新编码为C,然后将其重新编码,或使用MATLAB Coder自动生成C代码,然后使用它。