MATLAB 编译MEX文件的方法

申明:本文非笔者原创,原文转载自:http://anony3721.blog.163.com/blog/static/51197420109711222364/

通过MEX文件可以在MATLAB中像调用内嵌函数一样调用现有的使用C语言和Fortran等语言编写的函数,实现了代码重用,同时也能解决MATLAB循环效率低的缺点,提高MATLAB环境中数据处理的效率。

MEX文件的后缀名为 .mexw32

MEX文件的编写和编译需要两个基本条件:一是必须按照MATLAB应用程序接口组件和相关工具,二是要有C语言或Fortran语言的编译器。

需要对MATLAB系统进行设置,使MATLAB系统知道使用系统的哪一个C语言编译器,以及其参数和路径。

MEX文件系统设置:

>> mex –setup 按照提示进行,最后出现Done…系统配置完毕。

C语言MEX文件的建立

C语言MEX文件的建立

1.       MEX文件的结构

a)         计算子程序

b)        入口子程序,void mexFunction(int nlhs, mxArray *plhs[],int nrhs,const mxArray *prhs[]) { /*用户特定的代码….*/        }

2.       创建timestwoalt.c

#include "mex.h"

void timestwo_alt(double *y, double x)

{

*y = 2.0*x;

}

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

                int nrhs, const mxArray *prhs[] )

{

double *y;

double x;

/* 检查参数 */

if (nrhs != 1) {

    mexErrMsgTxt("One input argument required.");

} else if (nlhs > 1) {

    mexErrMsgTxt("Too many output arguments.");

} else if (!mxIsNumeric(prhs[0])) {

    mexErrMsgTxt("Argument must be numeric.");

} else if (mxGetNumberOfElements(prhs[0]) != 1 || mxIsComplex(prhs[0])) {

    mexErrMsgTxt("Argument must be non-complex scalar.");

}

/* 为输出参数创建变量 */

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

   /*

     为参数 xy赋值,x为值,而y为指针

    (由于MATLAB没有值传递,所以用指针才能得到修改后的y值,

     不然修改的是y的一个副本,为临时变量,在函数返回时,y值没有变化,

     不能得到希望的结果)

   */

x = mxGetScalar(prhs[0]);

y = mxGetPr(plhs[0]);

/* 调用timestwo_alt 子函数 */

timestwo_alt(y,x);

}

3.       编译链接C语言的MEX文件源程序,在MATLAB的控制窗口中输入:mex timestwoalt.c生成一个名为timestwoalt.mexw32MEX文件

4.       运行:在MATLAB的控制窗口中输入

x=2;

y=timestwoalt(x)

输出:y=4

MEX文件实现了一种C语言与MATLAB的接口,其实际的计算功能仍在C语言形式的计算子程序中完成,而入口子程序的功能是检查参数以匹配C语言的参数规范(how to?)。

当有C语言编写的大型程序时,不必用MATLAB语言重新编写,只要将此C语言程序作为一个计算子程序,然后编写一个入口子程序,完成参数的匹配,然后编译成MEX文件即可。

MEX文件的另外一个功能是可以将MATLAB编程中的瓶颈问题,如多重循环等,将此类费时的指令用C语言实现,然后作必要的入口子程序,编译成MEX文件,可以有效地提高MATLAB的效率。

S- 函数创建器限制了 C 语言 S- 函数的功能:   只能有一个输入信号和一个输出信号,而且只能处理 double 类型的数据!所以,可用性不大。
  • 7
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值