EDA365电子论坛网
标题:
MATLAB调用C/C++
[打印本页]
作者:
thinkfunny
时间:
2020-9-22 13:45
标题:
MATLAB调用C/C++
0 q2 i W s7 U9 [
Matlab是矩阵语言,如果运算可以用矩阵实现,其运算速度非常快。但若运算中涉及到大量循环,Matlab的速度令人难以忍受的。当必须使用for循环且找不到对应的矩阵运算来等效时,可以将耗时长的函数用C语言实现,并编译成Mex文件,Matlab便可以像调用内建函数一样调用C编写的函数。Mex文件其实是一种动态链接库,旧版本Matlab可以直接调用.dll,新版本要调用.mexw32或.mexw64文件。
' p0 I3 O7 [- Q( ]' A
/ V- e i' J5 S4 a# p
编译过程需要C语言编译器,在Matlab中键入mex –setup进行安装与配置。
1 z6 X- m# n0 S) b9 R* z+ A
. C! Y. C W3 g0 @" K) W1 {# l G+ ?
MEX文件的源代码组成:
i& s# M* |+ c( E
1 J0 U1 K3 I! ?
(1)功能子程序。该过程包含了Mex文件实现计算功能的代码,是标准的C语言子程序。
9 Y5 D( A: T- S6 l9 ~
- q3 m: {5 C0 V4 N2 F; P c5 w+ v
(2)入口子程序。该过程提供功能子程序与Matlab之间的接口,以mexFunction函数实现。注意,入口过程的名称必须是mexFunction,并且包含四个参数,即
% {$ z. b7 ?+ N: C& B
$ ]3 p9 F) J+ }+ R
void mexFunction(int nlhs,mxArray*plhs[],int nrhs,const mxArray *prhs[]);
5 T5 }2 f+ n* e# D; ^
4 q1 z( l: ^; E4 ]: `
nrhs(left hand side): 输入参数的个数;
1 Q3 _ X0 `8 v
0 ~8 F2 a/ ?$ R. U, k. R
prhs是一个输入数组,其内容为指针,指向mxArray类型的数据(MATLAB中所有数据都是以矩阵的形式mxArray保存的)。
) i) P8 A. ?, G& s: @; [
% R8 s4 V% D) s
nlhs, plhs含义类似。
" P, A" v( l* L! I$ r% W: `
- y( M, R+ A: j* ]
具体地,若在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])。
* n% W6 S) A; ^4 h" _
) w; H0 C `5 L
实例:
# e! {& @8 T. ?; p3 ^
; w6 y2 M; h6 ?0 l) I9 D
C语言函数,按照上述方式建立。
' z1 A, A: O: i$ y- x( z5 Q( e
. `4 l0 j+ T1 d8 N
C
) Y% M: U1 D* }
) Y- X: a- _' S# c& f
#include "mex.h"
/ p; K3 h9 [* H0 Y4 `' V
double add(double x, double y)
+ Z% A. ~" C& R
{
! G8 B+ e) R; }5 i, J( `
return x + y;
* C# \4 |& k2 z& m: v
}
$ R! ~. l# G- T( J/ ~
void mexFunction(int nlhs,mxArray *plhs[], int nrhs,const mxArray *prhs[])
# |$ C; L- W: x8 v2 G
{
# @7 t9 ]; _& J; A
double * a;
4 ~& r C* m4 U6 I+ \
double b, c;
& T2 T; g5 u+ b# C6 D+ k, `
plhs[0] = mxCreateDoubleMatrix(1, 1, mxREAL);
2 q \6 K @% {8 R \% l
a = mxGetPr(plhs[0]);
`. j6 G& m; H* t
b = *(mxGetPr(prhs[0]));
& g0 r5 f0 }8 U8 F; R+ e+ M
c = *(mxGetPr(prhs[1]));
- P) d5 Q. y# ?
*a = add(b, c);
3 F' V/ \0 T/ |6 b
}
. |/ H* @ F) R/ x/ u
1
6 F% u, G5 _2 b: j8 |
2
. Z7 Y2 a; |% U& V
3
) O. o( k3 x1 ?, I
4
* ~; ?! B |% k5 a
5
) {/ z* x! q4 m k/ b4 B: i
6
2 G6 p) F% d% q5 E. l1 I! p* K
7
. d& u0 b s! c7 v+ D, x0 V' \
8
. s. _4 p; o1 Z5 S
9
. r5 U% h* M5 O- l4 Z4 g c
10
) X: o B# k v* L: U, D: |; k
11
& P( s/ w; A7 ~/ u% J( \- F& [+ W
12
3 K* f- D o" J) Z# c
13
& b& g$ n* L4 y+ \
14
c6 s9 G9 j" y7 \) L; c& m) B
15
$ P! K( a" V0 i6 y& }) ~7 ^$ _
#include "mex.h"
$ V' j1 T: x" n* m9 w/ p4 @
double add(double x, double y)
" {# \: C' L" a6 m0 N
{
, l/ k$ j" L' X1 V4 D1 U. S; Q
return x + y;
- C1 e9 T1 t4 Z0 |
}
' F% _$ e- t. t+ M
void mexFunction(int nlhs,mxArray *plhs[], int nrhs,const mxArray *prhs[])
) C4 G2 N' o, }
{
) |0 w0 O+ X, x8 T/ }
double * a;
, R! B! t& O7 S& J' k
double b, c;
( s( j- S9 _% w4 r* I9 k
plhs[0] = mxCreateDoubleMatrix(1, 1, mxREAL);
1 G# _) Q, b2 ? \8 T4 [
a = mxGetPr(plhs[0]);
$ i7 R" r/ Q+ R! I% y; A5 m
b = *(mxGetPr(prhs[0]));
' f# o& h+ n* i3 U: y
c = *(mxGetPr(prhs[1]));
# ^- }" j( \( N4 Z9 a
*a = add(b, c);
* [, e" V3 F& ?) e
}
5 p% f6 W l0 P
接着,在MATLAB控制台输入:
k0 X0 t8 v/ E) a- m, p N6 t& b* ~
; E; a- O% A- P* ~
MATLAB
; v: d9 B- [9 Q
% c' ?3 X, B# I" S3 Q+ g! j- v3 e
mex add.c
. ^3 p; |$ B! ^4 |2 e
1
' }+ g3 }+ ^' B4 H* i1 z
mex add.c
7 c6 Q' A* N. U* Y
格式:mex C文件.c
& ]) I r3 Y. _3 A
5 ^) x2 c, P. H2 w1 p8 C* L
这时,路径目录下出现:
J0 j/ I4 b9 s t. A. _
; O7 k5 |( {3 E# z& e
最后在MATLAB控制台调用add函数即可。
1 M( m+ P$ S3 d" s1 C
( Q* M4 B( y" H. d5 }
add(2,3)
: y7 L( V- J# J# K# b
3 I8 U+ Q" M4 v# T- g, w. S
当然这个简单的函数不能体现C语言的快。
& ^* M4 r- y4 c9 _- G+ p
当有for循环或者大的计算函数时,调用C语言效率就会变得很高。
作者:
CCxiaom
时间:
2020-9-22 14:43
MATLAB调用C/C++
欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/)
Powered by Discuz! X3.2