|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
& G! p3 p5 W% Z
Matlab是矩阵语言,如果运算可以用矩阵实现,其运算速度非常快。但若运算中涉及到大量循环,Matlab的速度令人难以忍受的。当必须使用for循环且找不到对应的矩阵运算来等效时,可以将耗时长的函数用C语言实现,并编译成Mex文件,Matlab便可以像调用内建函数一样调用C编写的函数。Mex文件其实是一种动态链接库,旧版本Matlab可以直接调用.dll,新版本要调用.mexw32或.mexw64文件。
% T- h, r$ @5 | k" G8 K v; ?$ B
编译过程需要C语言编译器,在Matlab中键入mex –setup进行安装与配置。
* w# g* L; H1 v: z3 y( c$ F. j* ?( V1 t' u
MEX文件的源代码组成:9 G3 V, H# _$ w4 s$ Z' C
6 z7 n) S8 i' B0 N6 N
(1)功能子程序。该过程包含了Mex文件实现计算功能的代码,是标准的C语言子程序。
6 \+ O: V+ u$ t+ G
H+ F' o4 u/ C(2)入口子程序。该过程提供功能子程序与Matlab之间的接口,以mexFunction函数实现。注意,入口过程的名称必须是mexFunction,并且包含四个参数,即
5 j- g# V' ^- U5 J4 @- p& I8 E1 H% u
void mexFunction(int nlhs,mxArray*plhs[],int nrhs,const mxArray *prhs[]);) i+ Y# ~' X+ q$ b9 I* K% i
3 s4 x+ S1 R0 @1 z( wnrhs(left hand side): 输入参数的个数;+ _1 y+ K9 m* A% f
# U- ~% s# t; [! B
prhs是一个输入数组,其内容为指针,指向mxArray类型的数据(MATLAB中所有数据都是以矩阵的形式mxArray保存的)。
3 u8 F" T1 S! X5 G' s8 l1 W
& l$ \. F7 c: {1 Cnlhs, plhs含义类似。1 _' }' n8 W3 d
2 h# D) F0 m: H3 b- _具体地,若在Matlab中执行[a,b]=test(c,d,e) ,则nlhs=2, nrhs=3,prhs[0]指向c,prhs[1]指向d,prhs[2]指向e(可以理解为:prhs[0]=&c, prhs[1]=&d, prhs[2]=&e),注意prhs是const指针数组,故不能改变其指向内容;函数返回时将plhs[0],plhs[1]指向的内容赋给a,b(可以理解为a=*plhs[0], b=*plhs[1])。1 O2 W0 ?5 s W2 S5 V; J
- f7 U3 e ?7 F1 A% x实例:/ j( @, H$ A. @) i
* P( b6 f: G2 Y! d; i, hC语言函数,按照上述方式建立。
- }8 U' z$ y( S' r4 k$ d% a& u
. B |) H! h0 Y- K' zC8 g4 ?' k* a8 A' ~
/ h8 R: e$ v0 u$ n: r# t#include "mex.h"
- @& t. s! l Q" z& x' i* D% R" f/ J' ]double add(double x, double y) + }0 q! X3 ~; C; B
{
. I+ C( |' Q% s7 z2 v- l* _ return x + y; , Q& K$ R' D) x* U, I8 x! R
}
/ _/ F+ h/ K: `! P2 |3 C, p- A1 [void mexFunction(int nlhs,mxArray *plhs[], int nrhs,const mxArray *prhs[])
8 C6 M: W9 K+ f" G( o5 l" T{ ( S9 C$ z$ ?$ q! ^' ?% [4 J
double * a;
; ?8 v9 A! o1 D5 S& P& E double b, c;
/ _, m2 B( W2 M plhs[0] = mxCreateDoubleMatrix(1, 1, mxREAL); . o. B9 y7 J9 ^- Y
a = mxGetPr(plhs[0]); * t" a8 a* d2 j' Q: }* Q
b = *(mxGetPr(prhs[0])); , v5 {- y8 X9 Q
c = *(mxGetPr(prhs[1]));
& U5 E1 O( Q. B2 W s6 z4 H *a = add(b, c); 0 `3 p3 n9 q0 `* q
}/ q. ?, Q0 T C" D. Z" y$ E
1
. k1 \3 N% A: z! [4 C* ^+ L8 S8 L2
1 L$ i! }0 d7 Y0 s$ C; R3
3 i2 C o' r/ Y# j4
" b, x$ [4 D, E2 h5- H3 d" i% y2 S8 L) f( P0 O
6. t6 e+ c8 M3 B, X( K* d3 `8 n
79 ]! \# D3 m) z8 h' W$ w
8* z- u1 Q7 r' P( j
9
" ^2 W5 S* p( r. c* M10) r1 j2 G" I9 F3 x: t6 Q9 C9 M
11- X& U" X% f3 y3 v- t
12
2 u9 `( J! y/ I- x7 E13
* C P' {- d6 b14
& T3 o x, s- W9 N# R. {15; m. u0 c, E' `( x/ e5 F' b
#include "mex.h" 4 z& F" D: B1 O
double add(double x, double y) 2 v: s. B( x5 G: [
{ ) r i5 e+ n% w5 h# P. O, P2 }
return x + y;
4 I+ t- b4 v! B}
) r) u( r! y2 q h+ s* z; kvoid mexFunction(int nlhs,mxArray *plhs[], int nrhs,const mxArray *prhs[]) * Z* A; E2 _) Z7 F1 Y
{
6 c, k6 ?& b4 ]4 [/ \ double * a; / @% k/ Y5 Z G( I3 J% O/ ]
double b, c; ' B* }' k% C9 q
plhs[0] = mxCreateDoubleMatrix(1, 1, mxREAL); 6 z* z& }/ N9 o3 [; W3 _1 T9 Q
a = mxGetPr(plhs[0]);
9 U2 O( N* Q8 U: \ b = *(mxGetPr(prhs[0])); 8 E+ ~& ?/ { m: |2 l; A% E }# t
c = *(mxGetPr(prhs[1])); * s* X3 F# Q3 d) A
*a = add(b, c); + B8 c$ ^: v- p9 o/ j
}
- f m0 X7 G' F0 s7 O# x K$ Y& ?接着,在MATLAB控制台输入:# x4 H8 W& R# ]4 y. U( T/ F
/ {0 u' ~; b- T6 Z
MATLAB
( l! U! L) I ?1 i0 @% \$ Y- Z" h( X4 `# \6 w
mex add.c3 @5 C7 H: P" ^2 K+ X9 o$ l# q( E
1$ v+ V5 h6 C/ o" Y
mex add.c
$ Z! K$ `+ r2 X. X4 n! ]1 N' y" t格式:mex C文件.c
2 ^. X. ]& f" Q8 m$ D6 o; c
' v/ _; ~9 v& L# X3 A这时,路径目录下出现:
) |( w( R; @- b. p
$ \" N$ T9 V; A; H3 J$ k2 n8 W( ]* {最后在MATLAB控制台调用add函数即可。" k- c& \. N" u! p& M
3 ?/ L! G! N% D! v' u6 vadd(2,3)
; Z' g _: R! u- w1 O
' _- F4 f, }7 d* V当然这个简单的函数不能体现C语言的快。/ g# x! A+ w' Z8 b3 ~0 H$ ~
当有for循环或者大的计算函数时,调用C语言效率就会变得很高。 |
|