当前位置: 首页 > 工具软件 > mexplus > 使用案例 >

C++与MATLAB混合编程:MEX编程

戚飞雨
2023-12-01

在MATLAB中可调用的C或Fortran语言程序称为MEX文件。MATLAB可以直接把MEX文件视为它的内建函数进行调用。MEX文件是动态链接的子例程,MATLAB解释器可以自动载入并执行它。MEX文件主要有以下用途:       

  • 对于大量现有的C或者Fortran程序可以无须改写成MATLAB专用的M文件格式而在MATLAB中执行。        
  • 对于那些MATLAB运算速度过慢的算法,可以用C或者Frotran语言编写以提高效率。
具体操作过程:
  1. 在MATLAB中用命令mex -setup配置环境,找到对应的VS2010编译器
  2. 编写CPP源程序,源程序必须包括头文件#include "mex.h"(其中包括mex编程所需要的如矩阵等的定义)
  3. 通过MATLAB输入语句mex mexPlus.cpp。
  4. 调用时候以cpp文件名作为MATLAB函数调用,如下,调用方法为z = mexPlus(x, y);    z = myplus(x, y)是错误的。
源程序如下
#include "mex.h"

void myplus(double x[], double y[], double z[])
{
	z[0] = x[0] + y[0];
}



void mexFunction(int nlhs, mxArray * plhs[], int nrhs, const mxArray * prhs[])
{
	double *x, *y, *z;
	int mrows0, ncols0;
	int mrows1, ncols1;

	// 检查输入输出变量的个数
	if (nrhs != 2)
		mexErrMsgTxt("Tow input required.");
	else
		if (nlhs > 1)
		{
			mexErrMsgTxt("Too many output arguments.");
		}
		
		// 检查输入合法性
		mrows0 = mxGetM(prhs[0]);
		ncols0 = mxGetN(prhs[0]);
		if ( !mxIsDouble(prhs[0]) //|| !mxIsComplex(prhs[0]) 
							|| !(mrows0 == 1 && ncols0 == 1))
			mexErrMsgTxt("Input must be all noncomplex scalar double----------");
		mrows1 = mxGetM(prhs[1]);
		ncols1 = mxGetN(prhs[1]);
		if ( !mxIsDouble(prhs[1]) //|| !mxIsComplex(prhs[1]) 
							|| !(mrows0 == 1 && ncols0 == 1))
			mexErrMsgTxt("Input must be all noncomplex scalar double++++++++");

		// 由于调用格式为z = mexPlus(x, y);此时z为一个空白值,应为输出新建空间
		plhs[0] = mxCreateDoubleMatrix(mrows0, ncols0, mxREAL);

		//由此决定哪个是输入,哪个是输出
		x = mxGetPr(prhs[0]);
		y = mxGetPr(prhs[1]);
		z = mxGetPr(plhs[0]);

		myplus(x, y, z);
}

程序解析:
入口函数为如下,不得更改,nlhs为输出参数个数,plhs为输出参数矩阵,nrhs为输入参数个数,prhs为输入参数矩阵
void mexFunction(int nlhs, mxArray * plhs[], int nrhs, const mxArray * prhs[])

 类似资料: