您的位置:首页 > 编程语言 > MATLAB

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

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

对于大量现有的C或者Fortran程序可以无须改写成MATLAB专用的M文件格式而在MATLAB中执行。        
对于那些MATLAB运算速度过慢的算法,可以用C或者Frotran语言编写以提高效率。
具体操作过程:

在MATLAB中用命令mex -setup配置环境,找到对应的VS2010编译器
编写CPP源程序,源程序必须包括头文件#include "mex.h"(其中包括mex编程所需要的如矩阵等的定义)
通过MATLAB输入语句mex mexPlus.cpp。
调用时候以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[])
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++MATLAB混合编程