一、安装配置MinGW-w64 C/C++编译器
- 从官网下载并安装MinGW-w64
- 在系统变量下添加变量名:MW_MINGW64_LOG,变量值为MinGW-w64安装目录
- 然后进入Matlab R2020b界面,在窗口中输入:
setenv('MW_MINGW64_LOC', 'D:\Software\mingw-w64\mingw64');
- 再输入mex -setup检查,完成编译器的配置
二、编写C语言程序MEX代码
- 在Matlab工作目录下新建add.cpp文件
- 引入头文件mex.h
- 编写C语言函数
- 编写mexFunction 入口函数
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
- nlhs:函数左侧,输出参数数目 (Left-hand side)
- plhs:函数左侧,指向输出参数的指针
- nrhs:函数右侧,输入参数数目
- prhs:函数右侧,指向输入参数的指针
例如,使用
[a,b] = add(c,d,e)当调用mex函数test时,传给test的这三个参数分别是: prhs[0]=c ,prhs[1]=d ,prhs[2]=e
当函数返回时,将会把你放在 plhs[0],plhs[1]里的地址赋给a和b,达到返回数据的目的
- 编译add.cpp文件
mex add.cpp -output 函数名
- 通过函数名调用函数
示例代码
//add.cpp文件
#include "mex.h"
double add(double x, double y)
{
return x + y;
}
//设置接口
void mexFunction(int nlhs, mxArray* plhs[], int nrhs, const mxArray* prhs[])
{
//变量申明
double* a;
double b, c;
//创建输出参数矩阵
plhs[0] = mxCreateDoubleMatrix(1, 1, mxREAL); //创建矩阵
a = mxGetPr(plhs[0]); //获得指向矩阵的指针
//读入输入参数矩阵
b = *(mxGetPr(prhs[0])); //获得输入参数矩阵的指针
c = *(mxGetPr(prhs[1])); //获得输入参数矩阵的指针
//调用函数
*a = add(b, c); //调用函数对输入参数进行运算并将结果放入事先创建的矩阵中
}
运行结果:
三、Matlab常用API
mxGetScalar(prhs[0]) :把通过prhs[0]传递进来的mxArray类型的指针指向的数据(标量)赋给C程序里的变量;
mxGetPr(prhs[0]) :从指向mxArray类型数据的prhs[0]获得了指向double类型的指针
mxGetM(prhs[0]):获得矩阵的行数
mxGetN(prhs[0]):获得矩阵的列数
mexPrintf("%d"):输出相应格式的变量值
mxCreateDoubleMatrix(int m, int n, mxComplexity ComplexFlag):实现内存的申请
其中 m:待申请矩阵的行数 ; n:待申请矩阵的列数