关于MATLAB与C的混合调用(1)

     很多时候会遇到需要MATLAB和C/C++混合调用的问题,刚开始接触,慢慢分享一下心得,也督促自己坚持学习。

  --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------   

    matlab默认的程序文件是.m文件,但有很多情况下需要用matlab调用C语言程序,归纳起来有以几种情况:
1、matlab程序中的某模块非常耗时,改用C语言编写可以提高执行速度。
2、现有成熟算法已经用C语言编写完成,但是matlab程序需要调用其中的某一算法,但不想改写成为.m程序
3、从.m程序可以直接获取源代码,为了保护知识产权,作者希望只提供接口,和库函数,供使用者调用。类似于Windows系统动态链接库(.dll)
  以上常见问题可以通过mex文件轻松解决。

   一、 MEX文件:
   MEX从字面上是MATLAB和Executable 两个单词的缩写。 即:matlab可执行文件的缩写
   .MEX文件是一种可在matlab环境中调用的C(或fortran)语言衍生程序,MEX文件的后缀名按32位/64位分别为 .mexw32/.mexw64。
   MEX文件是由C或Fortran语言编写的源代码,经matlab编译器处理而生成的二进制文件。它是可以被matlab解释器自动装载并执行的动态链接程序,类似windows下的dll文件。
   MEX文件实现了一种其它语言与MATLAB的接口,通过MEX文件可以在MATLAB中像调用内嵌函数一样调用使用C语言和Fortran等语言编写的函数,实现了代码重用,同时也能提高MATLAB环境中数据处理的效率。

    编写MEX文件之前需要配置matlab编译器,由于之前已配置好,这里不做介绍了(网上很多相关方法)。

注:MEX是Matlab Executable的缩写,它是一种“可在Matlab中调用的C(或Fortran)语言衍生程序”[6]。MEX文件的使用极为方便,其调用方式与Matlab的内建函数完全相同,只需在Matlab命令提示符下键入MEX文件名即可。

   C的.mex函数相当于MATLAB中的.m函数,mexfuction(para1,para2,...)和function(para1,para2,...)对应的参数输入相似,两个函数的输出值也是相似的。具体参数根据具体应用。

 注:一个C/C++的MEX源程序通常包括4个组成部分,其中前3个是必须包含的内容,第4个则根据所实现的功能灵活选用:(1)#include “mex.h”;(2)MEX文件的入口函数mexFunction, MEX文件导出名必须为mexFunction函数;(3)mxArray;(4)API函数

通过简单的例子说明C/C++的MEX源程序编写和调用过程:(转载)


  #include "mex.h"


  void  timeSTwo(double y[], double x[])


            {  y[0] = 2.0*x[0];  }


  void  mexFunction(int  nlhs,  mxArray * plhs[], int nrhs,  const mxArray *prhs[])


{


double *x,*y;  int  mrows, ncols;


  if( nrhs!=1)  mexErrMsgTxt("One input required.");


  else if( nlhs>1) mexErrMsgTxt("Too manyoutput arguments");


            mrows = mxGetM( prhs[0] );  ncols = mxGetN(prhs[0]);


  if( !mxIsDouble(prhs[0]) || mxIsComplex( prhs[0] ) || !( mrows ==1 && ncols==1 ) )


            mexErrMsgTxt( "Input must be a noncomplex scalar double." );


  plhs[0] = mxCreateDoubleMatrix (  mrows,  ncols,  mxREAL );


  x = mxGetPr( prhs[0] );    y = mxGetPr( plhs[0] );  timestwo(y,x);  }


 可在matlab中编译,也可以直接在C++环境中编译:
1.(在matlab中)用指令mex  timestwo.c编译此文件,然后在MATLAB命令行下调用生成的MEX文件即可。2. (在VC2008中)和一般c++一样编译后,就会产生dll,这样可以直接在Matlab中用了,或者copy且更改后缀名.mexw32即可。(因为Matlab R2010b以后版本可能不支持调用dll为后缀的mex文件了)


 二、 如何调试C MEX S-Functions:
(Microsoft Visual C/C++ .NET)
1、mex –setup选择编译器 Visual C/C++ .NET。
2、mex –g ***.c编译mex文,此命令产生***.mexw32文件。
3、打开microsoft开发环境,不退出matlab。
4、VC中,选择tools-->debug Process;选择matlab.exe并attach;在打开的对话框中选择Native,点击Ok。
5、通过File——> open ——>  ***.c打开源文件。
6、在合适之处设置断点。
 
注意事项:
1、 每一次改动完mex文件后,应该终止调试,重新编译,才能真正保存改动,以新的文件进行调试运行。
2、  mex中对于输入的矩阵元素值按列索取。
3、  mex文件中的所有的变量声明需在所有执行语句之前。
4、  已进入调试状态下,进行mex –g/-v ***.c编译会出错,应该注释掉。

    我遇到的问题是需在MATLAB中直接调用SVM的c程序,直接make.m文件就可产生需要的.mex文件。运行make.m文件之后,开始输入各项参数,README文件详细地介绍了各项参数的设置和需求。由于SVM是与另一种算法做对比,所以实验需要的数据都已预处理好。直接带入.mex文件后,得到的精度非常低。(因为并没有经历选参步骤,还需更深了解SVM的理论原理和代码意义)......



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值