您的位置:首页 > 其它

Spokesmen, How to make the Cosmetic legend(6)

2007-08-02 00:58 459 查看
如果你有一个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是输入参数数组。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: