MATLAB与VC++混合编程(1)——在MATLAB下调试C/C++程序

如果你有一个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 =  
0571114317142285
28553425399345605126
56906252681273717927
8480903295801012510668
1120711743122751280313327
1384814364148761538315886
1638316876173641784618323
1879419260197202017320621
2106221497219262234722762
2317023571239642435124730
2510125465258212616926509
2684127165274812778828087
2837728659289322919629451
2969729935301633038130591
3079130982311643133631498
3165131794319283205132165
3227032364324493252332588
3264332688327233274832763
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是输入参数数组。 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值