MATLAB是矩阵语言,是为向量和矩阵操作设计的,一般来说,如果运算可以用向量或矩阵实现,其运算速度是非常快的。但若运算中涉及到大量的循环处理,MATLAB的速度令人难以忍受。当必须使用for循环时,可以把它写为MEX文件,这样不必在每次运行循环中的语句时MATLAB都对它们进行解释。将这种文件改写成c或者c++,用mex编译之后在MATLAB里调用。
具体步骤是怎样的呢??
1、编写Mex源文件
会涉及到一些编写的规则,void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]){} 这个规则和格式可以百度。
因为任务需要,我在这里以ExtractGabor_Cplus.cpp为例。
2、编写compile文件来编译ExtractGabor_Cplus.cpp,不会写可以参考我的这个案例写法。
注意:因为.cpp用到了opencv,所以在编译的时候需要引入opencv的安装路径。如果你的.cpp文件中没有用到opencv,直接mex -g filename.cpp就编译啦~
compile_logGabor.m
% Compiles mex files
clc;
clear all;
if ispc
disp('PC');
include = ' -ID:\MenghanZhou\Han_Tools\VS2013\opencv\build\include\opencv\ -ID:\MenghanZhou\Han_Tools\VS2013\opencv\build\include\ -ID:\MenghanZhou\Han_Tools\VS2013\opencv\build\include\opencv2\';
%D:\MenghanZhou\Han_Tools\VS2013\opencv\build\include\opencv\
%D:\MenghanZhou\Han_Tools\VS2013\opencv\build\include\
%D:\MenghanZhou\Han_Tools\VS2013\opencv\build\includeopencv2\
libpath = 'D:\MenghanZhou\Han_Tools\VS2013\opencv\build\x64\vc12\lib\';
files = dir(fullfile(libpath, '*.lib'));
lib = [];
for i = 1:length(files),
lib = [lib ' ' libpath '\' files(i).name];
end
eval(['mex -g ExtractGabor_Cplus.cpp' include lib]);
end
if ismac
disp('Mac');
include = ' -I/opt/local/include/opencv/ -I/opt/local/include/';
libpath = '/opt/local/lib/';
files = dir([libpath 'libopencv*.dylib']);
lib = [];
for i = 1:length(files),
lib = [lib ' ' libpath files(i).name];
end
eval(['mex -g logGabor.cpp' include lib]);
end
if isunix
disp('Unix');
include = ' -I/usr/local/include/opencv/ -I/usr/local/include/';
libpath = 'D:\MenghanZhou\Han_Tools\VS2013\opencv\build\x86\vc11\lib\';
files = dir([libpath 'libopencv*.so.2.2']);
lib = [];
for i = 1:length(files),
lib = [lib ' ' libpath files(i).name];
end
eval(['mex -g logGabor.cpp' include lib]);
end
disp('Compilation finished.');
注意:这里的-g选项是调试时必须的。这里很重要的一点是生成的.pdb文件是路径依赖的,即使是同一个.cpp文件生成的mex文件,它们在不同路径下的得到的.pdb文件也不能互用。在某一个路径下调试mex程序(.cpp文件),必须用这个路径下的的.pdb文件。
3、运行compile_logGabor.m,如果.cpp文件没有bug的话,运行之后会出现如下结果。
在你的matlab工程文件夹下会生成下面几个文件。
4、用VS中打开ExtractGabor_Cplus.cpp,注意:导航栏文件----打开-----文件-----选择ExtractGabor_Cplus.cpp就可以了,并不需要建立什么项目。
5、将Matlab进程附加到VS编译器中
成功附加之后,会出现如下效果。
6、在ExtractGabor_Cplus.cpp中添加断点
这个时候的断点有可能是以空心点的方式出现的,正常的。
7、在调用.cpp文件的那一行打断点。
8、运行matlab文件,等待击中断点后,F10进入VS中进行调试。(会自动跳转到VS中)
可以愉快的调试啦!!!!