MATLAB调用C语言函数实例教学

MATLAB在数值运算、图像处理、实时仿真方面具有很大得优势,但它得运行速度远远不及C语言或C++,为了解决这一问题,MATLAB提供了和C/C++混合编程的接口,以此讲MATLAB对运算、图形处理得优点和c语言运行速度快得特点想结合。

混合编程的一般步骤:MATLAB 函数使用MATLAB格式数据 —>C/C++程序首先解析MATLAB数据 —>解析后运行C/C++程序,得到结果 —>C/C++程序最后要把上述结果数据打包成MATLAB格式输出给MATLAB中的主调程序。MATLAB是不能直接调用c语言的函数的,需要将c语言代码编译乘mex文件才可以调用,其中会用到一些辅助函数,本文以一个加法的例子介绍一下MATLAB与C混合编程的方法。

第一步 创建一个C文件

文件命名为add.c。


第二步 添加头文件“mex.h”

这一项是必须的,mex.h中包含了编译中用到的接口变量,函数等。


第三步 定义c语言的功能函数

void add(double *x,double *y,double *z)

{

   *z=*x+*y;

}

这里我们全部用指针的方式传递输入输出参数,实现z=x+y的功能。

第四步 定义MexFunction函数

这也是最关键的一步,MexFunction是c语言和MATLAB的接口函数,完成文章开头所叙述的操作。

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

{

 double *x, *y;             /*被加数和加数*/

 double *z;                /*和*/

 ///////判断输入输出参数的维度

  if(nrhs!=2) {

       mexErrMsgIdAndTxt("MyToolbox:arrayProduct:nrhs","Two inputs required.");

   }

   if(nlhs!=1) {

       mexErrMsgIdAndTxt("MyToolbox:arrayProduct:nlhs","One outputs required.");

   }

////////////////

 x=mxGetPr(prhs[0]);//获取第一个输入参数的指针

 y=mxGetPr(prhs[1]); //获取第二个输入参数的指针

 plhs[0] = mxCreateDoubleMatrix(1, 1, mxREAL); //创建输出矩阵

 z = mxGetPr(plhs[0]);//获取第一个输出参数的指针

 add(x,y,z);调用add函数

 

}

代码中有详细的注释,这里对四个输入参数简单的介绍:

nlhs说明调用语句左手面(lhs-left hand side)有几个变量,输出数据个数

nrhs说明调用语句右手面(rhs-right hand side)有几个变量,输入数据个数。

*plhs是一个数组,其内容为指针,该指针指向数据类型mxArray。代表左手边数据,也就是输出数据。

*prhs同上,代表输入数据

第五步 编译

需要提前安装好MinGW-w64工具箱,一般安装MATLAB的时候默认是不安装的,安装方法很简单,主页-附加功能->搜索“MinGW-w64”。


搜索MinGW-w64


点进去之后在右侧回看到下载和下载并安装,直接下载安装就可以了。需要注意的是这个附加功能仅支持2017b以上的版本。


然后就可以在命令行编译,直接输入以下命令即可:

mex add.c

编译成功后会在当前文件夹生成一个mexw64文件(32位系统的话就是mexw32)。


第六步 MATLAB调用

直接在脚本文件或者命令行调用即可。

a=add(1,2);

要保证输入有两个参数,输出一个参数,这里不能省略输出参数,因为我们在MexFunction中编写了判断输入输出参数的代码,如果没有输出参数的话,就会报错:


到这里就结束了,希望这个简单的例子能够帮到大家。


免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删

QR Code
微信扫一扫,欢迎咨询~

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 155-2731-8020
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

手机不正确

公司不为空