没有合适的资源?快使用搜索试试~ 我知道了~
Matlab以MEX方式“调用”C源代码.pdf
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 64 浏览量
2021-10-30
04:44:09
上传
评论
收藏 75KB PDF 举报
温馨提示
试读
12页
MATLAB
资源推荐
资源详情
资源评论
Matlab 以 MEX方式“调用”C 源代码
阅读 () 评论 () 发表时间: 2008 年 09 月 26 日 00:46
本文地址: http://qzone.qq.com/blog/3311493-1222361217
如果我有一个用 C语言写的函数,实现了一个功能,如一个简单的函数:
double add(double x, double y)
{
return x + y;
}
现在我想要在 Matlab 中使用它,比如输入:
>> a = add(1.1, 2.2)
3.3000
要得出以上的结果,那应该怎样做呢?
解决方法之一是要通过使用 MEX文件, MEX文件使得调用 C函数和调用 Matlab 的内置函数
一样方便。 MEX文件是由原 C代码加上 MEX文件专用的接口函数后编译而成的。 可以这样理
解, MEX文件实现了一种接口,它把在 Matlab 中调用函数时输入的自变量通过特定的接口
调入了 C 函数,得出的结果再通过该接口调回 Matlab 。该特定接口的操作,包含在
mexFunction 这个函数中,由使用者具体设定。
所以现在我们要写一个包含 add 和 mexFunction 的 C 文件, Matlab 调用函数,把函数中的
自变量(如上例中的 1.1 和 2.2 )传给 mexFunction 的一个参数, mexFunction 把该值传给
add,把得出的结果传回给 mexFunction 的另一个参数, Matlab 通过该参数来给出在 Matlab
语句中调用函数时的输出值(如上例中的 a)。
值得注意的是, mex 文件是与平台有关的,以我的理解, mex 文件就是另类的动态链接库。
在 matlab6.5 中使用 mex -v 选项,你可以看到最后 mex 阶段有类似如下的信息:
--> "del _lib94902.obj"
--> "del "test.exp""
--> "del "test.lib""
也就是说,虽然在 matlab6.5 生成的是 dll 文件,但是中间确实有过 lib 文件生成。
比如该 C 文件已写好,名为 add.c 。那么在 Matlab 中,输入:
>> mex add.c
就能把 add.c 编译为 MEX文件(编译器的设置使用 指令 mex -setup ),在 Windows 中,MEX
文件类型为 mexw32,即现在我们得出 add.mexw32 文件。现在,我们就可以像调用 M函数那
样调用 MEX文件,如上面说到的例子。所以,通过 MEX文件,使用 C函数就和使用 M函数
是一样的了。
我们现在来说 mexFunction 怎样写。
mexFunction 的定义为:
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
/*....................................*/
}
可以看到, mexFunction 是没返回值的,它不是通过返回值把结果传回 Matlab 的,而是通
过对参数 plhs 的赋值。 mexFunction 的四个参数皆是说明 Matlab 调用 MEX文件时的具体信
息,如这样调用函数时:
>> b = 1.1; c = 2.2;
>> a = add(b, c)
mexFunction 四个参数的意思为:
nlhs = 1 ,说明调用语句左手面( lhs -left hand side )有一个变量,即 a。
nrhs = 2 ,说明调用语句右手面( rhs -right hand side )有两个自变量,即 b 和 c。
plhs 是一个数组, 其内容为指针, 该指针指向数据类型 mxArray 。因为现在左手面只有一个
变量,即该数组只有一个指针, plhs[0] 指向的结果会赋值给 a。
prhs 和 plhs 类似,因为右手面有两个自变量,即该数组有两个指针, prhs[0] 指向了 b,
prhs[1] 指向了 c。要注意 prhs 是 const 的指针数组,即不能改变其指向内容。
因为 Matlab 最基本的单元为 array ,无论是什么类型也好, 如有 double array 、 cell array 、
struct array,, 所以 a,b,c 都是 array ,b = 1.1 便是一个 1x1 的 double array 。而在 C
语言中, Matlab 的 array 使用 mxArray 类型来表示。所以就不难明白为什么 plhs 和 prhs
都是指向 mxArray 类型的指针数组。
完整的 add.c 如下:
#include " mex.h" // 使用 MEX文件必须包含的头文件
// 执行具体工作的 C 函数
double add(double x, double y)
{
return x + y;
}
// MEX文件接口函数
void mexFunction(int nlhs,mxArray *plhs[], int nrhs,const mxArray *prhs[])
{
double *a;
double b, c;
plhs[0] = mxCreateDoubleMatrix(1, 1, mxREAL);
a = mxGetPr(plhs[0]);
b = *(mxGetPr(prhs[0]));
c = *(mxGetPr(prhs[1]));
*a = add(b, c);
}
mexFunction 的内容是什么意思呢?我们知道,如果这样调用函数时:
>> output = add(1.1, 2.2);
在未涉及具体的计算时, output 的值是未知的,是未赋值的。所以在具体的程序中,我们
建立一个 1x1 的实 double 矩阵(使用 mxCreateDoubleMatrix 函数,其返回指向刚建立的
mxArray 的指针),然后令 plhs[0] 指向它。接着令指针 a 指向 plhs [0] 所指向的 mxArray
的第一个元素(使用 mxGetPr 函数,返回指向 mxArray 的首元素的指针)。同样地,我们把
prhs[0] 和 prhs [1] 所指向的元素(即 1.1 和 2.2 )取出来赋给 b 和 c。于是我们可以把 b
和 c 作自变量传给函数 add,得出给果赋给指针 a 所指向的 mxArray 中的元素。因为 a 是指
向 plhs[0] 所指向的 mxArray 的元素,所以最后作输出时, plhs[0] 所指向的 mxArray 赋值
给 output ,则 output 便是已计算好的结果了。
上面说的一大堆指向这指向那, 什么 mxArray ,初学者肯定都会被弄到头晕眼花了。 很抱歉,
要搞清楚这些乱糟糟的关系,只有多看多练。
实际上 mexFunction 是没有这么简单的,我们要对用户的输入自变量的个数和类型进行测
试,以确保输入正确。如在 add 函数的例子中,用户输入 char array 便是一种错误了。
从上面的讲述中我们总结出, MEX文件实现了一种接口, 把 C 语言中的计算结果适当地返回
给 Matlab 罢了。当我们已经有用 C编写的大型程序时,大可不必在 Matlab 里重写,只写
个接口,做成 MEX文件就成了。另外,在 Matlab 程序中的部份计算瓶颈(如循环),可通
过 MEX文件用 C语言实现,以提高计算速度。
以上是对 mex文件的初步认识,下面详细介绍如何用 c 语言编写 mex 文件:
1 为什么要用 C语言编写 MEX文件 MATLAB 是矩阵语言,是为向量和矩阵操作设计的,一
般来说, 如果运算可以用向量或矩阵实现, 其运算速度是非常快的。 但若运算中涉及到大量
的循环处理, MATLAB的速度的令人难以忍受的。解决方法之一为,当必须使用 for 循环时,
把它写为 MEX文件,这样不必在每次运行循环中的语句时 MATLAB都对它们进行解释。
2 编译器的安装与 配置
要使用 MATLAB编译器,用户计算机上应用事先安装与 MATLAB适配的以下任何一种 ANSI
C/C++编译器:
5.0 、6.0 版的 MicroSoft Visual C++(MSVC)
5.0 、5.2 、5.3 、5.4 、5.5 版的 Borland C++
剩余11页未读,继续阅读
资源评论
jishuyh
- 粉丝: 0
- 资源: 7万+
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功