原文网页:https://zhuanlan.zhihu.com/p/34648899
MATLAB中MEX文件的编写与调试
mex是MATLAB运行C/C++代码的一种手段, 一旦完成, 使用方法和普通的MATLAB函数是一样的.之所以使用它, 主要目的是为了提速. 当你使用了一切MATLAB技巧(向量化, 并行循环, profiler等), 速度还是不够快的时候, mex是一个大杀器(当然, 大杀器不能轻易使用 ) , 因为你要用C/C++语言来写, 一般比较花时间, 使用MATLAB的人一般就是看重MATLAB的快速编程优势)
mex一般有两种生成方法:
第一种, 借助coder, 自动生成mex
优势是: 1 快速生成 2 一般是没有bug的
缺点: 1部分MATLAB函数不被coder不支持 2 生成的mex速度有可能还不如MATLAB的普通函数. 原因是自动化生成的东西, 有大量冗余在里面.
第二种, 自己手工写C/C++代码, 或者网上下载C/C++, 修改成mex接口.
优势是: 1 运行速度一般比较快(只要代码写得不要太烂了)
缺点是: 1 比较耗时(你懂的, 同样的功能, C/C++的代码长度比MATLAB代码长的多)
2 容易产生bug
关于怎么尽量避免bug, 我的经验做法是:
写C/C++的风格的MATLAB代码, 完成算法, 并且调通. 然后直接翻译成C/C++.
所谓的"C/C++的风格的MATLAB代码"指的是:
1 不要用向量化, 满屏幕的for循环嗨起来.
2 不要用高级函数, 使用基本函数(C/C++有对应的函数, 比如四则运算, 三角函数等)
使用了这种方法写mex, 出bug的几率就很小了.
但是写完了C/C++, 并转换成了mex, 运行时, 发现某些corner cases产生了bug, 怎么办呢?
如果是昨天的我, 会将这些corner cases保存成文件, 然后写一个main函数, 读取文件, 然后按照C/C++的debug基本流程来debug.
但是这是一种比较间接的方法. 今天读了一下MATLAB的mex相关的文档, 学到了一招, 可以直接调试. 也就是这篇文章的主题.
第一步, 命令窗口输入:
mex -g yprime.c
注意, 通常我们编译成mex文件, 使用的命令是:
mex yprime.c
多输入了"-g"
生成了两个文件: “yprime.mexw64"和"yprime.mexw64.pdb”
第一个文件不意外, 就是我们需要的mex文件, 第二个文件我第一次见到, 看最后结尾".pdb", 应该是用来调试, 符合我的debug意图.
第二步, 打开mex设置版本的visual studio:
第三步, “调试”," 附加到进程", 就会出现下面的对话框或者直接使用“搜索”:
选中MATLAB.exe, 然后点"附加"
第四步, “文件”, “打开”, 选中"yprime.c"
第五步, 想要设置断点的行设置断点
这个就不细说了, 这个都不知道的读者可能不适合使用mex了.
第六步, 运行mex文件.
yprime(1, 1:4);
可以看到visual studio在断点出停住了.
第七步, visual studio的常规debug操作了.
第八步, 找到出错源代码, 改正后, 再生成mex
第九步, 如果还是出错. 那么第一步到第八步再来一遍.