我知道这可能是一个非常着名的主题,但我找不到任何可以帮助我的东西。
这是情景:
我有一个myFun.m函数,无论里面是什么,它都是一个通用函数,它可能依赖于其他工具箱。它有输入和输出;
我想生成类似的myFun.mex函数;
我有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的通用方法吗?
干杯,
塞巴斯蒂安
答案 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项目中。或将其交付给嵌入式设备。
您的问题的主要答案是:
.m
代码生成MEX文件文件,请手动将其重新编码为C,然后将其重新编码,或使用MATLAB Coder自动生成C代码,然后使用它。