MATLAB实战 - MEX文件

MATLAB实战 - MEX文件应用接口是 MATLAB 与其他语言相互调用各自函数的方法 MEX 文件使 MATLAB 程序中可以调用或链接其他语言编写的函数 而 MATLAB 引擎使其他语言程序中可以调用 MATLAB 函数 01 MEX 文件 MEX 是 MATLAB Executable 的缩写 是 MATLAB 中用于调用其他语言编写的程序的接口

大家好,我是讯享网,很高兴认识大家。

应用接口是MATLAB与其他语言相互调用各自函数的方法,MEX文件使MATLAB程序中可以调用或链接其他语言编写的函数,而MATLAB引擎使其他语言程序中可以调用MATLAB函数。

01、MEX文件

1. MEX函数


讯享网

2. MEX文件源程序的建立


MEX文件源程序由如下两个部分组成。
(1) 入口子程序。入口子程序的默认名字mexFunction,其作用是在MATLAB系统与被调用的外部子程序之间建立联系,定义被MATLAB调用的外部子程序的入口地址、MATLAB系统和子程序传递的参数等。入口子程序的定义格式如下: 

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

讯享网

 入口子程序有4个参数。nlhs定义输出结果的个数,plhs指向用于返回输出结果的变量,nrhs定义输入参数的个数,prhs指向存储输入参数的变量。prhs和plhs都是指向mxArray对象的指针,C++程序与MATLAB工作空间交换数据必须使用mxArray对象,对象各成员的值默认为double类型。
(2) 计算子程序。计算子程序包含所有完成计算功能的程序,由入口子程序调用。计算子程序的定义格式和其他C/C++子程序的定义格式相同。
头文件mex.h中包含了所有的MEX函数声明,因此在文件首部需要加入宏命令:

讯享网#include "mex.h"

 下面用一个实例说明MEX文件的基本结构。
【例1】用C++编写求两个数的最小公倍数的MEX文件源程序,并编译生成MEX文件。调用该MEX文件,求两个整数的最小公倍数。
程序如下:

# include "mex.h" //求最小公倍数子程序 double com_multi(double *x,double *y){ int a, b, c, d; a = int(*x); b= int(*y); c=a>=b?a:b; d=c; while (c%a!=0 || c%b!=0) c=c+d; return c;
讯享网//入口子程序 void mexFunction( int nlhs, mxArray *plhs[ ], int nrhs, const mxArray *prhs[]){ double *result; int m,n, i; //检查参数数目是否正确 if(nrhs!= 2) { mexErrMsgTxt("输入参数应有两个!");return; } if(nlhs!= 1) { mexErrMsgTxt("应有一个输出参数!");return; //检查输入参数的类型 for(i= 0;i<2;i++){ m= int(mxGetM(prhs[i])); n = int(mxGetN(prhs[i])); if( mxIsClass(prhs[i],"int") || !(m ==1 &&n==1)){ mexErrMsgTxt("输入参数必须是一个数."); } } //准备输出空间 plhs[0] = mxCreateDoubleMatrix(1,1,mxREAL); result= mxGetPr(plhs[0]);//计算 *result= com_multi(mxGetPr(prhs[0]),mxGetPr(prhs[1]));

 将以上程序保存到当前文件夹,文件名为TryMex.cpp。


3. MEX文件源程序的编译


MEX文件源程序的编译需要具备两个条件:一是要求已经安装MATLAB应用程序接口组件及其相应的工具,另一个是要求有合适的C/C++语言编译器。
编译MEX文件源程序有两种方法:一是利用MATLAB提供的编译器,二是利用其他编译工具,如Microsoft Visual Studio。若使用MATLAB提供的编译器,则编译MEX源程序使用mex命令。例如,编译例1的MEX源程序,在MATLAB命令行窗口输入如下命令:

>> mex TryMex.cpp
讯享网>> z = TryMex(8,34) z = 136

小讯
上一篇 2025-02-19 07:16
下一篇 2025-02-07 15:01

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/34127.html