MATLAB C-MEX混合编程

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
MEX 文件主要有以下用途:
1.对于大量现有的 C 或者 Fortran 程序可以无须改写(相对而言,修改的很 少,只需完成接口函数即可)成 MATLAB 专用的 M 文件格式而在 MATLAB 中执 行。
2.对于那些 MATLAB 运算速度过慢的算法,可以用 C 或者 Frotran 语言编写 以提高效率。
/* 在 MATLAB 命令行方式下,本 MEX 文件的调用格式是 y=timestwo(x) 输入参数(x)个数=1,输出参数(y)个数=1,所以在程序一 开始就检查 nrhs 是否=1 以及 nlhs 是否>1(因为 MATLAB 有一个缺省 输出参数 ans,所以 nlhs 可以=0 */
mrows = mxGetM(prhs[0]); /* 获得输入矩阵的行数 */ ncols = mxGetN(prhs[0]); /* 获得输入矩阵的列数 */ if( !mxIsDouble(prhs[0]) || mxIsComplex(prhs[0]) || !(mrows==1 && ncols==1) )
timestwo(y,x); /* 调用 C 函数 timestwo(y,x) */ }
把上面这个文件 timestwo.c 编辑完成后,在 matlab 命令行里输入:
mex timestwo.c
matlab 会提示你选择一个编译器进行编译,如果安装了 VC,则选择 VC++即
可。编译完成后会在同一目录下生成同名的动态链接库文件 timestwo.mexw32。
例子
在 matlab 中的 EDIT 编辑如下文件,然后 save as timestwo.c。可以在 “<MATLABroot>\extern\example\mex”目录下找到其他的一些例子。
#include "mex.h" /* timestwo.c 本 MEX 文件的目的是实现 timestwo 的功能*/
mexErrMsgTxt("Input must be a noncomplex scalar double."); /* 判断 输入矩阵是否是 double 类,以及它是否只包括单个元素 */
/* 为输出创建一个矩阵,显然这个矩阵也应该是 1x1 的 */ plhs[0] = mxCreateDoubleMatrix(mrows,ncols, mxREAL); x = mxGetPr(prhs[0]); /* 获得指向输入/输出矩阵数据的指针 */ y = mxGetPr(plhs[0]);
void timestwo(double y[], double x[]) {
y[0] = 2.0*x[0]; }
/*下面这个 mexFunction 的目的是使 MATLAB 知道如何调用这个 timestwo 函数*/
void mexFunction( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[] )
MEX 函数的执行流程
y= 4
C 语言 MEX 文件的构成
两部分:(1)计算子程序。 在例子中是:
void timestwo(double y[], double x[]) {
y[0] = 2.0*x[0]; }
(2)入口子程序。 在例子中是:
void mexFunction( int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[] ) 、 {
此后再输入“mex ***.c”编译 mex 文件时将不再提示用户选择编译器,而自动
选择imestwo.c
–setup”。
编译完成后即可使用此动态链接库了。在 MATLAB 命令行下输入:
x = 2;
y = timestwo(x)
将会显示:
在matlab命令行方式下本mex文件的调用格式是ytimestwox输入参数x个数1输出参数y个数1所以在程序一开始就检查nrhs是否1以及nlhs是否1因为matlab有一个缺省输出参数ans所以nlhs可以0mrowsmxgetmprhs0
MATLAB C-MEX 混合编程
首先,C-MEX 混合编程可以不用再 VC,或 VS 环境中编写,调试,编译(但是 要安装)。可以全部在 Matlab 软件中完成。
/* nlhs 是 MATLAB 命令行方式下输出参数的个数; *plhs[]是 MATLAB 命令行方式下的输出参数; nrhs 是 MATLAB 命令行方式下输入参数的个数; *prhs[]是 MATLAB 命令行方式下的输入参数; */
{ double *x,*y; //double 指针类型不能改变!! int mrows,ncols; /* Check for proper number of arguments. */ if(nrhs!=1) mexErrMsgTxt("One input required."); else if(nlhs>1) mexErrMsgTxt("Too many output arguments");
。。。。。。 }
/* nlhs 是 MATLAB 命令行方式下输出参数的个数; *plhs[]是 MATLAB 命令行方式下的输出参数; nrhs 是 MATLAB 命令行方式下输入参数的个数; *prhs[]是 MATLAB 命令行方式下的输入参数; */
计算子程序是完全的 c 语言编写的,而入口子程序只需完成 MATLAB 系统与 计算子程序的接口,相对简单。
相关文档
最新文档