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。

matlab 调用python numpy matlab 调用C 结构体_matlab

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

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

matlab 调用python numpy matlab 调用C 结构体_数据_02

第三步 定义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”。

matlab 调用python numpy matlab 调用C 结构体_MATLAB_03


搜索MinGW-w64

matlab 调用python numpy matlab 调用C 结构体_c语言_04


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

matlab 调用python numpy matlab 调用C 结构体_数据_05


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

mex add.c

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

matlab 调用python numpy matlab 调用C 结构体_matlab_06

第六步 MATLAB调用

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

a=add(1,2);

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

matlab 调用python numpy matlab 调用C 结构体_数据_07