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函数一样调用了。
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函数一样调用了。
/**//* * 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 |
上面这个文件写好后,就可以编译了。编译前有一些准备工作要做。
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是输入参数数组。
相关文章推荐
- Spokesmen, How to make the Cosmetic legend(1)
- Spokesmen, How to make the Cosmetic legend(8)
- Spokesmen, How to make the Cosmetic legend(3)
- Spokesmen, How to make the Cosmetic legend(4)
- Spokesmen, How to make the Cosmetic legend(2)
- Spokesmen, How to make the Cosmetic legend(5)
- Spokesmen, How to make the Cosmetic legend(7)
- Spokesmen, How to make the Cosmetic legend(9)
- The Defining Decade-Why Your Twenties Matter--And How to Make the Most of Them Now
- think about how to make the function close to really world
- How to make 9-patch image downloaded from the Network
- Data for the People: How to Make Our Post-Privacy Economy Work for You
- AxWindowsMediaPlayer how to make the Tracker disappear when playing
- HOWTO:How to make the WebGrid work like an Excel sheet
- How to make XAML project to build faster on the Windows Platform
- Notes on how to use Webots, especially how to make a robot fly in the air
- How to make two <div>…</div> in the same row?
- enough is enough - how to make a dmg the way you expect it
- xendesktop 7 How to Make StoreFront the Default Page within IIS