如果你有一个C/C++的函数需要测试,利用MATLAB平台是一个经济高效的选择。你不必花过多的精力去理会IO的问题,并且可以很方便的利用 MATLAB的函数来验证你的函数的正确性。有时,你还可以利用MATLAB产生测试数据。这样做还有一个很大的好处,你不必等到整个程序写完了才进行测试。每写完一个小函数,就进行调试和测试,确保其顺利运行和得到正确的输出值,特别是对科学计算函数,你必须保证你的函数的计算结果是在要求的精度范围内的。
我假设OS是Windows XP,MATLAB的版本是6.1,我用表示其根路径。
第一个简单的例子是编写一个定点运算的sin函数,通过mex编译成dll形式的mex文件,然后就可以在MATLAB下像普通的m函数一样调用了。
| /**//* INT mlsak_sin(INT angle) if ( angle<0 ) ...{ angle %= 360; switch (angle/90) ...{ // ------------------------------------------------------------------------- #ifdef TEST_MATLAB_TRIGON_SIN #include \"mex.h\" void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) ...{ int angle; double *sinv; angle = (int)mxGetScalar(prhs[0]); plhs[0] = mxCreateDoubleMatrix(1,1,mxREAL); sinv = (double*) mxGetData(plhs[0]); *sinv = (double) mlsak_sin(angle); return; } #endif//!TEST_MATLAB_TRIGON_SIN |
mex.h在/extern/include/下,该文件又包含了matrix.h文件,在前者中declare的函数名皆以mex开头,在后者中申明的函数名皆以mx开头,具体可以查阅帮助。
上面这个文件写好后,就可以编译了。编译前有一些准备工作要做。
STEP1. 在MATLAB下运行mex -setup,当然如果以前运行过而且现在又不想指定别的C/C++编译器,就跳过。设置很简单,step by step,就是指定编译器,我这里指定的是VC 6.0。
STEP2. 在MATLAB下或cmd中运行mex -DTEST_MATLAB_TRIGON_SIN Example1.cpp -output mysin. 这样在当前目录下你就会看见一个mysin.dll的文件(注意前面不要加.dll,MATLAB会自动加上)。如果你是要一个调试多级泵版本,就在命令行中加上-g开关。如果你对C/C++编译器还有些参数要指定,可以将 /bin/win32/mexopts/msvc60opts.bat拷贝到当前目录下修改之,再加上-f 就行了。
STEP3. 现在已经可以在MATLAB下调用mysin了,当然得注意要让MATLAB找得着这个文件。还可以在mysin.dll的同一个目录下写一个mysin.m文件,提供帮助信息。如果想能够进行调试,就转入下一步。
STEP4. 在cmd下键入msdev mysin.dll。现在,vc打开了,打开你要调试的C/C++文件,这个例子中就是Example1.cpp,设置好阳光泵业断点,按Alt+F7,在 Debug表单的Excuitable for debug session中键入/bin/win32/matlab.exe就行了。按F5,MATLAB就被打开,好,可以工作了。
下面解释一下mex的入口函数,mexFunction,它就好比C/C++中的main函数一样。mxArray是matrix.h中定义的 struct结构类型,对于它的操作有相应的接口函数,不用深究其结构。mexFunction有4个参数,分别对应于命令的返回值和输入参数,在这个例子中,mysin接受一个参数,angle,一个返回值,sinv。lhs,是left hand side的缩写,因为返回值在命令的左边,rhs是right hand side的缩写,因为输入参数在命令的右边。nlhs是返回值的个数,plhs是返回值数组,nrhs是输入参数个数,prhs是输入参数数组。
转载于:https://blog.51cto.com/cangshi004/775406
本文介绍了如何利用MATLAB平台测试C/C++函数,以定点运算的sin函数为例,详细说明了从编写函数、mex编译到在MATLAB中调用的过程,以及在WindowsXP环境下配置和调试的方法。
1676

被折叠的 条评论
为什么被折叠?



