找回密码
 注册
关于网站域名变更的通知
查看: 383|回复: 1
打印 上一主题 下一主题

MATLAB调用C/C++

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2020-9-22 13:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
4 U3 z% D1 B- h/ B
Matlab是矩阵语言,如果运算可以用矩阵实现,其运算速度非常快。但若运算中涉及到大量循环,Matlab的速度令人难以忍受的。当必须使用for循环且找不到对应的矩阵运算来等效时,可以将耗时长的函数用C语言实现,并编译成Mex文件,Matlab便可以像调用内建函数一样调用C编写的函数。Mex文件其实是一种动态链接库,旧版本Matlab可以直接调用.dll,新版本要调用.mexw32或.mexw64文件。
) j$ M8 o& f1 b" N
) ?* f/ w- h/ n! {5 v3 G( p编译过程需要C语言编译器,在Matlab中键入mex –setup进行安装与配置。
* D# h; \1 N/ g% `! l
& x; c' L1 a0 dMEX文件的源代码组成:
. s4 X" a5 _" H) }: N! }9 a8 I
: H; ^3 z8 I, y2 J1 ?% @9 G(1)功能子程序。该过程包含了Mex文件实现计算功能的代码,是标准的C语言子程序。
# ]2 |  y, O9 w9 q, J# R
: N7 v  S5 b& O  n2 }" H  W* _(2)入口子程序。该过程提供功能子程序与Matlab之间的接口,以mexFunction函数实现。注意,入口过程的名称必须是mexFunction,并且包含四个参数,即
  x" \' e8 B& v! q1 w' G: _5 ]/ i: N3 n" E- C5 d' i' ]
void mexFunction(int nlhs,mxArray*plhs[],int nrhs,const mxArray *prhs[]);  v& U" u' B. P# u% M9 N# e

+ Y  }, O- Q! B3 q% R+ T4 u7 z& Rnrhs(left hand side): 输入参数的个数;" }- v, M6 r! Z3 c7 {

4 n1 r- }* h* q4 A2 q" f, ~  q4 v! Mprhs是一个输入数组,其内容为指针,指向mxArray类型的数据(MATLAB中所有数据都是以矩阵的形式mxArray保存的)。
( c* n! i, e+ m' Z
. J! I3 u# Q; a1 i  l4 Q1 j5 inlhs, plhs含义类似。8 u0 ]  |) h# \* ?4 }; g

! [* x2 p) f8 j- z具体地,若在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])。9 g; O) [; q) e
( W5 S  {' R8 E' S
实例:
: U3 ?( i7 m& ]- B" D$ x& i, ^; {7 T" U3 K% F; {6 c
C语言函数,按照上述方式建立。
# a9 w: l: e: \  ^/ s6 Z0 T) f6 w  {5 w  x( ~
C5 X5 f$ c3 Y1 a* z* z# O/ P* r7 O

0 ~( M: G$ k2 q$ m2 \0 s0 Z) F#include "mex.h"   
7 B1 f- b5 w# \" ~. G1 U8 ldouble add(double x, double y)  
" }, V$ i4 |; q5 N; t, i{  
2 A0 }* c% V) m5 U: b! q7 E7 O# x    return x + y;  ) i/ }" d; ~0 l: h6 `$ b
}   
( _& R; n+ Z8 z+ ?2 E$ [! Fvoid mexFunction(int nlhs,mxArray *plhs[], int nrhs,const mxArray *prhs[])  ! `( l7 Y2 q  P& g" b
{  
; ]- A: w1 S' ^    double * a;  
4 w# P$ j+ a0 G! p, W* P8 v    double b, c;  
) S+ ?, b$ k" @& n    plhs[0] = mxCreateDoubleMatrix(1, 1, mxREAL);  
7 E8 H1 p3 H6 _7 t2 m# U: @    a = mxGetPr(plhs[0]);  ( r/ C8 W+ ~5 x0 _2 _+ W0 d: ?9 q+ ?! Z
    b = *(mxGetPr(prhs[0]));  
( D$ p/ V9 @' D1 M8 v    c = *(mxGetPr(prhs[1]));  
2 ^! T( k. L' k( @9 h) f$ A    *a = add(b, c);  ) E! ^3 F) {) T" B" o  e: F6 `" @+ E
}
% [" e3 E; S6 Y: p; s' t/ A9 Y% `1
( v3 X8 o5 }, h2& z7 }( h7 _7 a% {+ W
3! j2 j! O( \# b) i& M; J
45 t4 t2 x$ `* e" A% y
51 b1 r$ }7 l: R5 ^, s" g
6
$ y8 C4 O4 l9 p" D7 y+ G7
8 q$ I3 I2 X$ g3 s+ v( H* G" q8
# S; \4 ~0 r* o  _! v% V/ w! W! a5 K9+ T" x# _% U8 h: Q7 J
10, b* o- o  e; n6 C( h6 o9 K
113 E% j" t9 v* J2 {# U
12+ ~* h/ q9 |% L8 C: ], n
13. s. C3 P) \' x; |
14* Z8 ^* Q6 S, R) S6 M
15
5 Q8 E; Y+ d& M% }, D#include "mex.h"   
9 W; C7 e! A: N! r, kdouble add(double x, double y)  
4 m9 Q. `$ v* v{  1 f3 y3 ]- _2 J" R$ S5 j, E
    return x + y;  
: i( i% ]# m* F1 s- s}   ; {9 @+ y% y( W" J9 C
void mexFunction(int nlhs,mxArray *plhs[], int nrhs,const mxArray *prhs[])  . h4 f9 _/ c4 |
{  5 C% G  L& }3 e2 }" F/ x7 K
    double * a;  9 Q) o0 h" Q2 j4 B# [. h  {- [* _
    double b, c;  % V2 f& d# d  h) Q, }. B4 i
    plhs[0] = mxCreateDoubleMatrix(1, 1, mxREAL);  
) C5 Q* J% F% d1 v+ X    a = mxGetPr(plhs[0]);  
; X& ?8 |  q. `" c    b = *(mxGetPr(prhs[0]));  
* |* t2 m& N% U, X    c = *(mxGetPr(prhs[1]));  
) m* Y& y7 ^, W; s/ s    *a = add(b, c);  0 o; V( R$ H/ r' ?% l' X
}6 n+ G1 D, y# w, g. k9 D$ z
接着,在MATLAB控制台输入:
6 e8 z% V- l6 c- n6 A8 C& Z$ m/ B( x# o  c* p9 g+ P
MATLAB
$ `( U4 H! w" K9 r  M0 a, E. f1 N& H  U7 _0 [: q) b
mex add.c4 e2 z. t" t1 B) z! t
1
4 {. f, m$ i7 I0 ]; m: Z& bmex add.c
$ G* K% P8 l$ T1 f( T格式:mex C文件.c
5 W% Y% b" F7 g* I) ~0 W
6 m6 c0 M$ \5 B4 A这时,路径目录下出现:
7 }: h- b3 t/ d  ?  m0 C$ k( a! K" y8 r/ w0 c; Y6 L
最后在MATLAB控制台调用add函数即可。9 W9 s9 w7 [( ^& f0 E3 v, l

5 D- o+ E7 u6 ^5 {add(2,3)7 G7 J" o' y1 ?

" ^1 L# l' x  R) x- D- m当然这个简单的函数不能体现C语言的快。
4 S4 j& O  Y7 m( M" _- A+ |; g) m/ M当有for循环或者大的计算函数时,调用C语言效率就会变得很高。

该用户从未签到

2#
发表于 2020-9-22 14:43 | 只看该作者
MATLAB调用C/C++
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-11-24 22:17 , Processed in 0.171875 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表