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

MATLAB调用C/C++

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
# ]; ?/ @& ~) ?+ ~% w/ @% I+ M
Matlab是矩阵语言,如果运算可以用矩阵实现,其运算速度非常快。但若运算中涉及到大量循环,Matlab的速度令人难以忍受的。当必须使用for循环且找不到对应的矩阵运算来等效时,可以将耗时长的函数用C语言实现,并编译成Mex文件,Matlab便可以像调用内建函数一样调用C编写的函数。Mex文件其实是一种动态链接库,旧版本Matlab可以直接调用.dll,新版本要调用.mexw32或.mexw64文件。- G4 W! C! ?0 I5 @5 t& t' _9 c
- r3 G" I/ s# Z+ A) E4 j/ N
编译过程需要C语言编译器,在Matlab中键入mex –setup进行安装与配置。
0 Q! s/ r2 K( I- |1 d2 m: Z- \, ~& q& B3 g- Z( f
MEX文件的源代码组成:
1 {' w: S/ J8 p& E" Z; s; A1 t* Y" S
(1)功能子程序。该过程包含了Mex文件实现计算功能的代码,是标准的C语言子程序。
( n' z& f3 m5 ~( G7 i4 y' M6 z
: C* u3 Z3 u( h+ N6 {(2)入口子程序。该过程提供功能子程序与Matlab之间的接口,以mexFunction函数实现。注意,入口过程的名称必须是mexFunction,并且包含四个参数,即
7 H1 A' F1 |5 @: P  i
$ `0 D3 E( d" b2 R& Lvoid mexFunction(int nlhs,mxArray*plhs[],int nrhs,const mxArray *prhs[]);8 \0 _4 p( _. o' B8 h: _
. H+ U, c2 \  U) q; M3 t3 Z
nrhs(left hand side): 输入参数的个数;! n$ \/ W3 Z  J+ s" V
' e' B% h1 G- v$ |, p
prhs是一个输入数组,其内容为指针,指向mxArray类型的数据(MATLAB中所有数据都是以矩阵的形式mxArray保存的)。
- G# y) e9 M  ~+ H$ L6 {
. R' v3 e! a, cnlhs, plhs含义类似。
/ K! \0 i0 n# C; c1 K/ ?1 I( R
: X' @! L' [3 C# _具体地,若在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])。
! A$ h, w* |# g8 O3 B. o- v( J! b9 I1 q
% X2 q9 P8 B3 O6 L实例:
( e/ t1 x6 S4 L% X( e
5 F7 p: M  S- ?$ K' qC语言函数,按照上述方式建立。5 @; |& I$ `) ]; w( f

% F3 F" Z; a& p3 Z7 d, zC$ S! B7 J; \6 T
8 l+ k+ Y; \+ ?7 s/ [
#include "mex.h"    8 P  {0 j8 ^; U
double add(double x, double y)  7 w( u1 M# `# W/ E6 r1 \% k
{  ! I! J& K% P4 s4 s! e6 |
    return x + y;  
! Y2 p0 U+ o8 {3 J) A* q}   
2 Q4 m$ ]$ g5 Avoid mexFunction(int nlhs,mxArray *plhs[], int nrhs,const mxArray *prhs[])  : p) ^8 O, B! U& B2 {
{  
- h" G: }: h& U& T3 \    double * a;  
) U& i1 z+ J( `    double b, c;  : R( f4 ]7 g' V6 ?  G
    plhs[0] = mxCreateDoubleMatrix(1, 1, mxREAL);  
( i# m8 L( Z1 w9 r( ]' \1 a8 @    a = mxGetPr(plhs[0]);  
5 s) I5 n0 p; a! L, e3 t6 P$ S    b = *(mxGetPr(prhs[0]));  
# x1 ~+ y) z# j% H2 W/ [    c = *(mxGetPr(prhs[1]));  / Q; D, a: u: |& j1 U; }6 q
    *a = add(b, c);  
" Z- E6 P; K7 }; G. l}6 `+ f. f0 W2 l; B+ _
1
5 X  ]" i, D( y# J* F2
+ h8 {3 A/ y% p; F5 v: k' y+ h3
! E5 c5 i& h. H/ {5 y& z/ O4
6 d! v7 {4 }0 W' Z8 z' ?* o0 i% o5
& Z4 l0 \( t: {- X6
4 W  x/ m: u, D7
1 V+ t" O5 x! m8 A" J8! a. f, C  Z1 |
94 a2 p' ?$ t' P( }% l3 p5 O& ]0 Y
10
% B# o4 ^3 D+ P11% P% `9 Z8 ]& h% g! v' @, x( @
12+ \1 A  l4 r9 C' ?6 A% }9 V. Y
13! X9 Z6 e; Z8 Q
14+ h' m7 u6 R9 X$ F& n" S/ e
15& _& d. u* n" ?1 v. g
#include "mex.h"   
9 [) x3 ]: Z1 l( gdouble add(double x, double y)  
1 ]: a- a+ w6 c" j{  
+ L8 h0 W* O% H( p    return x + y;  
& @' Q& x& S+ p; c}   1 b" d' o- g+ U' \0 k9 k
void mexFunction(int nlhs,mxArray *plhs[], int nrhs,const mxArray *prhs[])  
8 U0 j2 @) ~4 G+ K{  0 G" y1 s1 G% p& e
    double * a;  
, ]0 s) W$ s  K" b    double b, c;  1 a; N+ t0 v% I. e
    plhs[0] = mxCreateDoubleMatrix(1, 1, mxREAL);  + w" Y5 e+ F7 s" A. E, ~' r0 ~
    a = mxGetPr(plhs[0]);  
8 z3 |% \1 m! h) J5 M    b = *(mxGetPr(prhs[0]));  8 q( ]* q. Y; L, a
    c = *(mxGetPr(prhs[1]));  3 i3 q( e5 F7 @3 A8 W# l9 @
    *a = add(b, c);  8 _  v, ?: h4 q; v  }
}
) q# b# B3 q3 \/ d+ y5 e/ _接着,在MATLAB控制台输入:; k$ r+ R6 N7 _5 c/ `
; P; ~' h/ m" t6 r4 E' ^6 J, ]$ T- J
MATLAB2 \1 E+ C8 W% n' v

# c$ {9 Y% }, `1 ^1 K  W1 `- Qmex add.c% z% C$ b2 [" o6 I
1
! _' P7 u/ K# D. M$ i% xmex add.c
% E: P4 _$ c9 j# }% s& M格式:mex C文件.c
& T/ t0 U1 V, N1 X! g: C$ L) Z) G2 S7 {/ W- P. Q8 X+ C4 ^
这时,路径目录下出现:
: M9 ]1 V1 o- i) i. y( L! {' ?- U2 T, G$ i9 ^5 a
最后在MATLAB控制台调用add函数即可。
( B& E' W  B* X6 ]3 M
8 j" {, u( j! p' V( f2 ?add(2,3): u7 ?: R5 n: x7 @* G! d1 @

1 n1 r7 H6 K& d当然这个简单的函数不能体现C语言的快。; N% i: F; e5 t) K7 |/ ?
当有for循环或者大的计算函数时,调用C语言效率就会变得很高。

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

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

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

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

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