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

MATLAB调用C/C++

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x

* a, O! e3 Y! _Matlab是矩阵语言,如果运算可以用矩阵实现,其运算速度非常快。但若运算中涉及到大量循环,Matlab的速度令人难以忍受的。当必须使用for循环且找不到对应的矩阵运算来等效时,可以将耗时长的函数用C语言实现,并编译成Mex文件,Matlab便可以像调用内建函数一样调用C编写的函数。Mex文件其实是一种动态链接库,旧版本Matlab可以直接调用.dll,新版本要调用.mexw32或.mexw64文件。& Z7 l" J" v% v' r. v; }& d

  F% }8 Z" w* Y/ n编译过程需要C语言编译器,在Matlab中键入mex –setup进行安装与配置。
6 |/ D& C$ e2 y0 W$ o. t8 Z' z* h1 h6 E. L
MEX文件的源代码组成:
1 z3 p, R  d7 X
% v0 g9 r+ ~4 ^9 R! @(1)功能子程序。该过程包含了Mex文件实现计算功能的代码,是标准的C语言子程序。" c9 Z5 B" M1 a
% p+ n2 j9 S- ]: z3 b3 q' \' ^0 f8 O
(2)入口子程序。该过程提供功能子程序与Matlab之间的接口,以mexFunction函数实现。注意,入口过程的名称必须是mexFunction,并且包含四个参数,即
$ T0 i% k3 z* f
$ [- o% |6 f$ vvoid mexFunction(int nlhs,mxArray*plhs[],int nrhs,const mxArray *prhs[]);& j' T/ E5 p0 [! z  n* x
( P# t' c8 s6 x3 t! _
nrhs(left hand side): 输入参数的个数;
* c$ h- B  E) h! z0 E+ V8 t* e2 {, ~4 y. s- ~
prhs是一个输入数组,其内容为指针,指向mxArray类型的数据(MATLAB中所有数据都是以矩阵的形式mxArray保存的)。! F3 M/ f: b! J2 f% B: D& x
4 j( g6 r! K" n3 x& P0 p3 A
nlhs, plhs含义类似。
4 j* U+ d2 Y( j) ]2 N6 p2 o* l# v8 ]3 }* O; r$ \! L3 E  }  W
具体地,若在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])。
8 N9 R" w) V3 \& \% u  j$ ?3 V/ x& f4 R% B2 b! L9 z( U
实例:1 }1 D$ b* Y  X3 g+ w  |  N

- `# I* G' @) Z' iC语言函数,按照上述方式建立。3 [6 z+ U( x! L9 Z% X: w+ u
6 Z, H7 g% j8 ?$ _
C* c5 m' R. w8 `+ `7 G+ v

* U9 d  x; P$ ^#include "mex.h"   
' @6 w. Z4 ^) [; K2 L' M5 Xdouble add(double x, double y)  9 R: O2 ?1 O" z6 w2 `
{  ! }8 {+ y$ Q+ P; I( t) P
    return x + y;  3 ^0 @, E; \9 s! x7 H- f9 ], F
}     g$ r% G9 h: |% i3 o9 I! n
void mexFunction(int nlhs,mxArray *plhs[], int nrhs,const mxArray *prhs[])  & r' z1 a9 L" V0 N) m
{  
8 {( {+ Q. L  N; U    double * a;  
$ ]( Y( H% w4 O3 n, x2 }, y. f    double b, c;  
9 }% V  [( [1 G0 v    plhs[0] = mxCreateDoubleMatrix(1, 1, mxREAL);  
* m) ]+ I. i/ E& W1 G4 Z8 D    a = mxGetPr(plhs[0]);  
1 `% X$ ~2 y- [; N* r( N7 H1 s    b = *(mxGetPr(prhs[0]));  / }2 R6 C: g2 ]' a& F) X9 G
    c = *(mxGetPr(prhs[1]));  
$ X) Q9 u# x2 f8 B/ L# k    *a = add(b, c);  
5 k$ \( |! ?2 R) T}# Q/ s6 [2 r+ F/ v# K- d
1
% x2 U' u* ]" N2: a! B! I- u$ G6 C
3
$ g3 [2 U( {, m7 n3 K4$ B- N  F8 K: V9 p
5! v. ?- E: s% T7 k7 F
6
) T- P2 b3 Q6 C  ^1 S7 y, m77 a- ~8 Y/ n; `  j' L3 P
8
) m7 ~' Q0 A( M2 f9
+ i  v% S+ ~- t) s/ B6 U4 y5 A109 G5 x$ c! M- C
11! \; a* Y$ q5 m' Y8 _
12
7 r1 o: ^& v$ k133 G! u$ @  c* m# }+ P; s6 ]# e4 o
14
: ?0 I# _- [$ L% A15+ V5 a  F2 C) }: H) V
#include "mex.h"    5 `' K4 @2 \1 ~3 S7 J
double add(double x, double y)  - V. e' r$ E; s# e- Q$ ^
{  $ s3 U7 r! K, Y- C! _. m, F
    return x + y;  
, x) P1 \3 ]2 _- W3 d$ ~4 j}   ( @3 O& f5 P* O1 s) M
void mexFunction(int nlhs,mxArray *plhs[], int nrhs,const mxArray *prhs[])  6 D+ H2 V& `0 h1 [
{  " y, M, |+ K0 j7 M( r& z8 \5 w
    double * a;  . O9 A6 ]0 F9 `1 _7 ^- M% g
    double b, c;  5 o: U- e3 F  N$ g2 ~
    plhs[0] = mxCreateDoubleMatrix(1, 1, mxREAL);  0 B( x) P% A: l9 c8 _
    a = mxGetPr(plhs[0]);  
+ W4 A' U" [3 E% K  Z) Z    b = *(mxGetPr(prhs[0]));  
" `9 o0 _/ H, }& w$ f7 ?    c = *(mxGetPr(prhs[1]));  
; V& Q# i& i: O1 x: ?6 e    *a = add(b, c);  ) \' i4 O; F- z) }: g  s' ]
}
  j9 ?' k' E2 ~5 l" {' r- P接着,在MATLAB控制台输入:
" l) i4 s+ z  ^2 j5 |: J) X. k4 N3 K
MATLAB
% w* {1 C# _5 u) W) H. R& ]$ o6 I# y2 K  K, T( B# c
mex add.c, U8 K. [: X' h. l8 o! }
1
/ l; |+ d, _5 c& x4 z$ zmex add.c; F- |: o3 K9 |0 h% z) n8 U
格式:mex C文件.c
! {; k7 Z+ \; e( E& O" p
1 L: K* _$ U0 ?; B  l! n* ^这时,路径目录下出现:) H8 u; l8 p" w) x4 w

3 ~9 \/ r6 q2 j9 n' I9 E最后在MATLAB控制台调用add函数即可。. ]# |7 I: w2 g' s% ~2 q/ B

' ^- i# {$ _7 @) i0 H% N$ Zadd(2,3)" Q7 [" i  m* O; A
# m& k3 i. P1 _
当然这个简单的函数不能体现C语言的快。
6 u3 c7 c7 K: B当有for循环或者大的计算函数时,调用C语言效率就会变得很高。

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-25 00:11 , Processed in 0.187500 second(s), 23 queries , Gzip On.

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

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

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