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

MATLAB调用C/C++

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
+ W6 f6 K0 d( G
Matlab是矩阵语言,如果运算可以用矩阵实现,其运算速度非常快。但若运算中涉及到大量循环,Matlab的速度令人难以忍受的。当必须使用for循环且找不到对应的矩阵运算来等效时,可以将耗时长的函数用C语言实现,并编译成Mex文件,Matlab便可以像调用内建函数一样调用C编写的函数。Mex文件其实是一种动态链接库,旧版本Matlab可以直接调用.dll,新版本要调用.mexw32或.mexw64文件。
- t9 @  ~) J0 T" b/ _
! G0 R4 r0 K$ K) T, G& l编译过程需要C语言编译器,在Matlab中键入mex –setup进行安装与配置。1 P- b1 N6 ?2 M8 z4 x
( m& ?' I6 h: d, D
MEX文件的源代码组成:. |. V# s7 y6 [, u9 K6 h
2 @* l% s2 @+ b- f+ k" F
(1)功能子程序。该过程包含了Mex文件实现计算功能的代码,是标准的C语言子程序。. M2 a, {* C- g& p+ ]. J) x" V

4 b  v8 Q4 q, w, r; n5 u2 k; o(2)入口子程序。该过程提供功能子程序与Matlab之间的接口,以mexFunction函数实现。注意,入口过程的名称必须是mexFunction,并且包含四个参数,即+ H5 s6 W( O% P) w5 E. [5 W; H

' H% x- w. O* M3 C; H8 yvoid mexFunction(int nlhs,mxArray*plhs[],int nrhs,const mxArray *prhs[]);
( z& {6 T2 O3 k' j/ d  Z3 @+ O+ K9 U! x) Q
nrhs(left hand side): 输入参数的个数;
5 W0 X, L. l, y5 A, b; d1 ?' I0 l4 [7 x
prhs是一个输入数组,其内容为指针,指向mxArray类型的数据(MATLAB中所有数据都是以矩阵的形式mxArray保存的)。- U% }- |/ o8 B& N+ L

5 F4 W3 S, |# Rnlhs, plhs含义类似。( E! n' r* ]* o7 p1 i7 Q+ Y0 l
$ X" f8 D: M+ |' Y
具体地,若在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])。
) p; u; K- ^' h! _! F
! k' n0 p8 o9 G6 }- ^/ J3 J/ C实例:4 f) f  h' ^/ R8 u
* O8 v0 Z0 v0 |" [, j
C语言函数,按照上述方式建立。
& g' K, B% I/ O
4 m- v5 Y7 M1 _5 x* _  PC
0 U! f: Z: m) k0 p- \* ?1 I& i: r; e. `" X6 ]) O- S: Y; [
#include "mex.h"   
- x! P: \6 B% tdouble add(double x, double y)  6 B8 G# {% [5 }  p& v" {
{  
) r5 A/ j$ }/ X/ E, C    return x + y;  7 G1 Z# E3 t" w: T' U" `2 c
}   0 ], o9 ?/ W# F5 M0 W* A
void mexFunction(int nlhs,mxArray *plhs[], int nrhs,const mxArray *prhs[])  1 t  q6 h& i3 L* `/ G0 U
{  * y' H, g% n* Z. m9 Y6 w, ~( ^
    double * a;  2 V6 m7 ~7 G$ a$ D& N. L# r
    double b, c;  
5 [; U4 z9 V$ W/ {/ _# s0 U    plhs[0] = mxCreateDoubleMatrix(1, 1, mxREAL);  ! `1 A" ~! T" C
    a = mxGetPr(plhs[0]);  
$ a* @$ B0 p' F2 T/ y5 r    b = *(mxGetPr(prhs[0]));  
9 @/ E+ r( r3 }    c = *(mxGetPr(prhs[1]));  
. t) S! z/ D2 i    *a = add(b, c);  8 S9 E% _1 v' W! R$ o; w3 ]. |8 d
}6 t, t+ |* L: A" K; r3 L7 `& b
1- k2 a. q6 o$ s- m/ o
2
- W% j8 v; C% H: `- j, H" b8 M0 R* d3
+ a* n7 S+ U9 I2 o4
6 X* f+ p% M( n0 Z5$ B: r/ m/ d& K7 S5 q# S6 L
6( q4 S( T; m0 [5 b2 ?2 ?
7
$ e( N2 ~9 s& t- h: Y8
: c6 _% ~& y/ ~$ a+ f9- \( z. Y5 H. j, J
10
1 x' E7 c4 q& j4 m3 Q8 D11
/ N4 ~$ @3 l9 d9 T8 `12. k' ]. V4 [# b2 [1 J  V& t1 \* e8 S
138 j& \# P' I, k% G
14
0 ^4 c! D6 @) A15  t$ v6 u1 ^9 [" S5 t
#include "mex.h"    % C# ^4 |7 l3 F
double add(double x, double y)  
3 n5 r, j& V, Z3 K0 m! W{  ' i4 O. S+ c8 X% c" g" X4 {7 ^
    return x + y;  
& C0 I0 T0 ~: u! S$ J7 X5 A8 C1 h}   
; }# [9 u# F6 Y* z5 B3 dvoid mexFunction(int nlhs,mxArray *plhs[], int nrhs,const mxArray *prhs[])  
+ q' R) @/ p$ x/ v% i5 i, b{  + t6 q3 I, Z. H" y2 f4 Z
    double * a;  
  ^% T) A3 s* j' S. |8 M; A    double b, c;  , Z+ R6 G, ~% ~1 n, z( M6 m8 G
    plhs[0] = mxCreateDoubleMatrix(1, 1, mxREAL);  6 ~+ w# h2 |1 L  E+ y. B
    a = mxGetPr(plhs[0]);  
; b7 }( H: v# t8 B* U    b = *(mxGetPr(prhs[0]));  
/ p9 n2 q; y- l) m9 Q: C9 l: T! [    c = *(mxGetPr(prhs[1]));  
( e% @/ [1 P. [! H) p    *a = add(b, c);  
6 |* E! ?4 o2 C* u}
. j, }8 I6 g9 n接着,在MATLAB控制台输入:
1 Y; S8 |' f* }
  O! S: j0 w6 y- x2 v% JMATLAB
) E/ y- U& I  u5 o6 D8 N
; p( C% S$ J; b! |; u, D' tmex add.c: A. [5 W4 w9 I. [! T0 S
1( Q/ y- U6 C! z+ X0 J$ e( J/ \2 y/ `
mex add.c& X* B; M! Y$ a; F! m6 Q, A2 p4 {5 t
格式:mex C文件.c
6 K3 m! |9 w9 F( T3 r
" ^9 ?& F% I3 T8 r这时,路径目录下出现:3 d  }$ x" r$ d4 O9 ^% q

) S" |& j0 S5 J& H8 L最后在MATLAB控制台调用add函数即可。
! E# @  s# o. K9 {  W% y4 l* v: J- Q( F  y( |& f
add(2,3)4 P  m* N8 y+ E8 D
) l+ \6 r2 v1 ]% o% ~1 M# f$ d$ F/ a
当然这个简单的函数不能体现C语言的快。
6 f1 B& e  C" ]; c当有for循环或者大的计算函数时,调用C语言效率就会变得很高。

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-24 20:28 , Processed in 0.156250 second(s), 24 queries , Gzip On.

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

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

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