我是靠谱客的博主 无心柜子,最近开发中收集的这篇文章主要介绍mex文件生成c语言,[转载]zz: 用C语言编写MEX文件[1],觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

1.1 为什么要用C语言编写MEX文件

MATLAB是矩阵语言,是为向量和矩阵操作设计的,一般来说,如果运算可以用向量或矩阵实现,其运算速度是非常快的。但若运算中涉及到大量的循环处理,MATLAB的速度的令人难以忍受的。解决方法之一为,当必须使用for循环时,把它写为MEX文件,这样不必在每次运行循环中的语句时MATLAB都对它们进行解释。

1.2 编译器的安装与配置

(1)在MATLAB命令窗口中运行mex –setup,出现下列提示:

Please choose your compiler for building

external interface (MEX) files:

Would you like mex to locate installed

compilers [y]/n?

(2)选择y,MATLAB将自动搜索计算机上已安装的外部编译器的类型、版本及所在路径,并列出来让用户选择:

Select a compiler:

[1] Lcc C version 2.4 in

D:MATLAB6P5P1syslcc

[2] Microsoft Visual C/C++ version 6.0 in

C:Program FilesMicrosoft Visual Studio

[0] None

Compiler:

(3)选择其中一种(在这里选择了1),MATLAB让用户进行确认:

Please verify your choices:

Compiler: Lcc C 2.4

Location: D:MATLAB6P5P1syslcc

Are these correct?([y]/n):

(4)选择y,结束MATLAB编译器的配置。

1.3 一个简单的MEX文件例子

【例1】用m文件建立一个1000×1000的Hilbert矩阵。

tic

m=1000;

n=1000;

a=zeros(m,n);

for i=1:1000

for j=1:1000

a(i,j)=1/(i+j);

end

end

toc

elapsed_time =

0.1100

在记事本中输入以下程序:

[Matlab_1.cpp]

#include "mex.h"

//计算过程

void hilb(double *y,int n)

{

int i,j;

for(i=0;i

for(j=0;j

*(y+j+i*n)=1/((double)i+(double)j+1);

}

//接口过程

void mexFunction(int nlhs,mxArray *plhs[],int

nrhs,const mxArray *prhs[])

{

double x,*y;

int n;

if (nrhs!=1)

mexErrMsgTxt("One inputs required.");

if (nlhs != 1)

mexErrMsgTxt("One output required.");

if

(!mxIsDouble(prhs[0])||mxGetN(prhs[0])*mxGetM(prhs[0])!=1)

mexErrMsgTxt("Input must be scalars.");

x=mxGetScalar(prhs[0]);

plhs[0]=mxCreateDoubleMatrix(x,x,mxREAL);

n=mxGetM(plhs[0]);

y=mxGetPr(plhs[0]);

hilb(y,n);

}

该程序是一个C语言程序,它也实现了建立Hilbert矩阵的功能。在MATLAB命令窗口输入以下命令:mex Matlab_1.cpp,即可编译成功。进入该文件夹,会发现多了两个文件:Matlab_1.asv和Matlab_1.dll,其中Matlab_1.dll即是MEX文件。运行下面程序:

tic

a=Matlab_1(1000);

toc

elapsed_time =

0.0470

由上面看出,同样功能的MEX文件比m文件快得多。

1.4 MEX文件的组成与参数

MEX文件的源代码一般由两部分组成:

(1)计算过程。该过程包含了MEX文件实现计算功能的代码,是标准的C语言子程序。

(2)入口过程。该过程提供计算过程与MATLAB之间的接口,以入口函数mxFunction实现。在该过程中,通常所做的工作是检测输入、输出参数个数和类型的正确性,然后利用mx-函数得到MATLAB传递过来的变量(比如矩阵的维数、向量的地址等),传递给计算过程。

MEX文件的计算过程和入口过程也可以合并在一起。但不管那种情况,都要包含#include

"mex.h",以保证入口点和接口过程的正确声明。注意,入口过程的名称必须是mexFunction,并且包含四个参数,即:

void mexFunction(int nlhs,mxArray *plhs[],int

nrhs,const mxArray *prhs[])

其中,参数nlhs和nrhs表示MATLAB在调用该MEX文件时等式左端和右端变量的个数,例如在MATLAB命令窗口中输入以下命令:

[a,b,c]=Matlab_1(d,e,f,g)

则nlhs为3,nrhs为4。

MATLAB在调用MEX文件时,输入和输出参数保存在两个mxArray*类型的指针数组中,分别为prhs[]和plhs[]。prhs[0]表示第一个输入参数,prhs[1]表示第二个输入参数,…,以此类推。如上例中,d→prhs[0],e→prhs[1],f→prhs[2],f→prhs[3]。同时注意,这些参数的类型都是mxArray *。

接口过程要把参数传递给计算过程,还需要从prhs中读出矩阵的信息,这就要用到下面的mx-函数和mex-函数。

1.5 常用的mex-函数和mx-函数

在MATLAB6.5版本中,提供的mx-函数有106个,mex-函数有38个,下面我们仅介绍常用的函数。

1.入口函数mexFunction

该函数是C

MEX文件的入口函数,它的格式是固定的:

void mexFunction(int nlhs,mxArray *plhs[],int

nrhs,const mxArray *prhs[])

说明:

MATLAB函数的调用方式一般为:[a,b,c,…]=被调用函数名称(d,e,f,…),nlhs保存了等号左端输出参数的个数,指针数组plhs具体保存了等号左端各参数的地址,注意在plhs各元素针向的mxArray内存未分配,需在接口过程中分配内存;prhs保存了等号右端输入参数的个数,指针数组prhs具体保存了等号右端各参数的地址,注意MATLAB在调用该MEX文件时,各输入参数已存在,所以在接口过程中不需要再为这些参数分配内存。

2.出错信息发布函数mexErrMsgTxt,mexWarnMsgTxt

#include "mex.h"

void mexErrMsgTxt(const char

*error_msg);

void mexWarnMsgTxt(const char

*warning_msg);

两函数的区别在于mexErrMsgTxt显示出错信息后即返回到MATLAB,而mexWarnMsgTxt显示警告信息后继续执行。

最后

以上就是无心柜子为你收集整理的mex文件生成c语言,[转载]zz: 用C语言编写MEX文件[1]的全部内容,希望文章能够帮你解决mex文件生成c语言,[转载]zz: 用C语言编写MEX文件[1]所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(50)

评论列表共有 0 条评论

立即
投稿
返回
顶部