c++ - 使用 Matlab Compiler 将 MATLAB .m 文件转换为 .mex 文件

标签 c++ c matlab mex

我知道这听起来像是一个非常有名的话题,但我没有找到任何可以帮助我解决这个问题的东西。

这是场景:

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

  2. 我想生成类似的 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 的通用方法是什么吗?

干杯,

塞巴斯蒂安

最佳答案

MATLAB Compiler 没有按照您的意愿执行。

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

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

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

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

还有另一种产品,MATLAB Coder ,这与 MATLAB 编译器不同。

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

然后您可以使用该 C 代码做很多事情,包括使用 MEX 将其编译回可用作 MATLAB 命令的形式。这通常可以(尽管并非总是)提供比原始 .m 代码显着的加速。您还可以做其他事情,例如将 C 代码集成到更广泛的 C 项目中。或将其传送到嵌入式设备。

您问题的主要答案是:

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

关于c++ - 使用 Matlab Compiler 将 MATLAB .m 文件转换为 .mex 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23492465/

相关文章:

java - JNA 如何包装用 C++ 编写的接口(interface)

php - php-cpp 是否适用于 C 库?

C:内存泄漏实现一个简单的链表

r - Octave/Matlab 中的scale() R 函数等效项

string - 在 MATLAB 中将数字转换为字符串

c++ - 与c++中枚举相关的问题。这已经是一个已知问题了吗?

java - 不满意链接错误 : no libhello in java. library.path

c - 在第 6731 次释放指针后双重释放或损坏

matlab - 在循环中更改变量名称

c++ - 在 cpp、OpenCV 中使用 "Select file"对话框创建 GUI