方法:
第一步:要先在matlab中安装c程序编译器,步骤如下:
键入命令:mex -setup;
选择c/c++编译器;
选择c/c++编译器版本;
确认。
第二步:键入:mex *.c
举例
//add.c
#include "mex.h"
//
使用MEX文件必须包含的头文件
//
执行具体工作的C函数
double add(double x,double y)
{
return x + y;
}
// MEX
文件接口函数
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);
}
对于函数mexFunction,是没返回值的,它不是通过返回值把结果传回Matlab的,而是通过对参数plhs的赋值。mexFunction的四个参数皆是说明Matlab调用MEX文件时的具体信息,如这样调用函数时:
>> b = 1.1; c = 2.2;
>> a = add(b, c)
mexFunction四个参数的意思为:
nlhs = 1,说明调用语句左手面(lhs-left hand side)有一个变量,即a。
nrhs = 2,说明调用语句右手面(rhs-right hand side)有两个自变量,即b和c。
plhs是一个数组,其内容为指针,该指针指向数据类型mxArray。因为现在左手面只有一个变量,即该数组只有一个指针,plhs[0]指向的结果会赋值给a。
prhs和plhs类似,因为右手面有两个自变量,即该数组有两个指针,prhs[0]指向了b,prhs[1]指向了c。要注意prhs是const的指针数组,即不能改变其指向内容。
因为Matlab最基本的单元为array,无论是什么类型也好,如有double array、 cell array、 struct array……所以a,b,c都是array,b = 1.1便是一个1x1的double array。而在C语言中,Matlab的array使用mxArray类型来表示。所以就不难明白为什么plhs和prhs都是指向mxArray类型的指针数组。
>> b = 1.1; c = 2.2;
>> a = add(b, c)
mexFunction四个参数的意思为:
nlhs = 1,说明调用语句左手面(lhs-left hand side)有一个变量,即a。
nrhs = 2,说明调用语句右手面(rhs-right hand side)有两个自变量,即b和c。
plhs是一个数组,其内容为指针,该指针指向数据类型mxArray。因为现在左手面只有一个变量,即该数组只有一个指针,plhs[0]指向的结果会赋值给a。
prhs和plhs类似,因为右手面有两个自变量,即该数组有两个指针,prhs[0]指向了b,prhs[1]指向了c。要注意prhs是const的指针数组,即不能改变其指向内容。
因为Matlab最基本的单元为array,无论是什么类型也好,如有double array、 cell array、 struct array……所以a,b,c都是array,b = 1.1便是一个1x1的double array。而在C语言中,Matlab的array使用mxArray类型来表示。所以就不难明白为什么plhs和prhs都是指向mxArray类型的指针数组。
然后就可正常调用了
>> output = add(1.1, 2.2);
实际上mexFunction是没有这么简单的,我们要对用户的输入自变量的个数和类型进行测试,以确保输入正确。如在add函数的例子中,用户输入char array便是一种错误了。
<MATLABroot>\extern\example
目录下有mex文件的举例,如mexFunction.c展现了C-Mex的基本框架,mexcpp.cpp说明了如何在C++语言中使用MEX文件,mex.h文件中有mex常用的库函数介绍。
VC.Net
环境下可编译和调试MEX文件,如下设置,
Tools->VC Include
加入<MATLABroot>\extern\include
Tools->VC library
加入<MATLABroot>\extern\lib\win32\microsoft
创建dll文件后,修改工程属性中的链接器,添加libmex.lib libmx.lib libmat.lib
Debug
的command中加入matlab.exe完整路径,
然后运行,报无符号信息提示,不用管,matlab自动打开,输入cd debug,运行exe文件,开始调试。