matlab如何编译mex文件

matlab如何编译mex文件,第1张

通过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

doublex

/* 检查参数 */

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)

/*

为参数 x、y赋值,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.mexw32的MEX文件

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类型的数据!所以,可用性不大。

首先,要保证MEX文件物历芹编译成功,烂没这个可以从罩毕编译的返回字串中看到。

其次,MEX所在的路径必须正确,要在Matlab的路径或你添加的路径中。

最后,MEX文件的入口函数一定要正确,参考例子程序。

希望能帮助你。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/12285645.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-22
下一篇2023-05-22

发表评论

登录后才能评论

评论列表(0条)

    保存