如果你有一个C/C++的函数需要测试,利用MATLAB平台是一个经济高效的选择。你不必花过多的精力去理会IO的问题,并且可以很方便的利用 MATLAB的函数来验证你的函数的正确性。有时,你还可以利用MATLAB产生测试数据。这样做还有一个很大的好处,你不必等到整个程序写完了才进行测试。每写完一个小函数,就进行调试和测试,确保其顺利运行和得到正确的输出值,特别是对科学计算函数,你必须保证你的函数的计算结果是在要求的精度范围内的。
我假设OS是Windows XP,MATLAB的版本是6.1,我用 表示其根路径。
第一个简单的例子是编写一个定点运算的sin函数,通过mex编译成dll形式的mex文件,然后就可以在MATLAB下像普通的m函数一样调用了。
/**/
/*
* Example1.cpp
* A fix point sin function, which accepts angle rather radian.
*/

static
WORD SIN_LUT[
91
]
=
...
{
0, 571, 1143, 1714, 2285,
2855, 3425, 3993, 4560, 5126,
5690, 6252, 6812, 7371, 7927,
8480, 9032, 9580, 10125, 10668,
11207, 11743, 12275, 12803, 13327,
13848, 14364, 14876, 15383, 15886,
16383, 16876, 17364, 17846, 18323,
18794, 19260, 19720, 20173, 20621,
21062, 21497, 21926, 22347, 22762,
23170, 23571, 23964, 24351, 24730,
25101, 25465, 25821, 26169, 26509,
26841, 27165, 27481, 27788, 28087,
28377, 28659, 28932, 29196, 29451,
29697, 29935, 30163, 30381, 30591,
30791, 30982, 31164, 31336, 31498,
31651, 31794, 31928, 32051, 32165,
32270, 32364, 32449, 32523, 32588,
32643, 32688, 32723, 32748, 32763,
32768
}
;

INT mlsak_sin(INT angle)

...
{
int sign=1;


if ( angle<0 ) ...{
angle=-angle;
sign = -1;
}

angle %= 360;


switch (angle/90) ...{
case 0:
return sign*SIN_LUT[angle];
case 1:
return sign*SIN_LUT[180-angle];
case 2:
return -sign*SIN_LUT[angle-180];
case 3:
return -sign*SIN_LUT[360-angle];
default:
return SIN_LUT[91]+1;
}
}

//
-------------------------------------------------------------------------
//
for test sin in MATLAB
//
sinv = mysin(angle)
//
-------------------------------------------------------------------------
//
#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是输入参数数组。
我假设OS是Windows XP,MATLAB的版本是6.1,我用 表示其根路径。
第一个简单的例子是编写一个定点运算的sin函数,通过mex编译成dll形式的mex文件,然后就可以在MATLAB下像普通的m函数一样调用了。















































































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是输入参数数组。