EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
前言:众所周知对于循环这种运算,matlab的运算速度是不快的 想起来个冷笑话,黑客帝国里的主角呢奥之所以能快过子弹,因为Matrix是matlab写成的hhhh 因此将循环部分用C语言写,然后编译成matlab可以调用的mex文件,无疑可以加快循环运算速度,从而加快整个代码速度 之前因为合并数据需要不会数据库,强行在matlab里利用类似excel的vlookup功能,无奈太慢,只能想办法最后知道了这种方法,最近偶然在桥哥的知识星球里又提到了,也顺便复习和记录一下。 ps:今天在闲鱼上买了小车车,高兴! 1.环境配置我的是matlab2019a,win10-64bit,c语言编译器我选的是TDM-GCC(gcc/g++),安装起来很简单,推荐matlab2015及以后的选择这种,详细安装过程可以见文末链接1中的For Matlab 2015部分
+ U- r( ?5 ^4 U( |2.如何编写可以被编译成matlab可执行文件的c语言代码我是在matlab中文论坛(地址见reference第2条)里找到如何编写的,不过他写的有点乱,我来消化后写一下自己的理解 mex接口函数跟一般的C语言文件主要是两点区别, 第一是必须引入头文件mex.h #include "mex.h"第二是多了一个叫mexFunction的函数 void mexFunction(int nlhs,mxArray *plhs[], int nrhs,const mxArray *prhs[])举个栗子: - ) N9 ^7 X f% c3 t4 D
, o, x$ s# {% h: g
#include "mex.h" // 使用MEX文件必须包含的头文件$ u- ]( v+ P+ Y7 _3 ^
% f5 q4 l: u" Z } - 6 n. D4 P. x' d$ U' \: t3 n4 y
9 V/ w7 O: T0 x6 @5 B" i// 执行具体工作的C函数6 }3 D, F c; w. D2 d. v' P: X, _$ w
- p2 |. O, d: `3 G. }$ C1 w
- % C+ V$ g! ~# s6 S1 Y( s% g
* n) T! ~* B/ v6 Z) i6 Q: Vdouble add(double x, double y)
7 h0 {8 v% w& Z2 c; q2 L- v' y) D7 a! [) D+ n* [0 Z
- ; z* S7 j; k+ J. ?
/ l; t% e% s. D- v( n
{
( ~: p4 R8 P, f9 c3 F8 i; |
4 K0 Y# l9 E3 S2 Z% f' l' H - % x0 t% G8 ?/ V% B
6 l1 Z) J: Z2 }3 D8 f return x + y;
9 I" N5 U1 Y" |: \' z7 H+ g& A8 N# j6 d( u- l7 q
7 y! C! l, V7 d$ q4 y# Z# _0 j, v$ h: f$ p* c0 B% L5 i$ X
}
& n' L: t3 K& A) H8 z0 e4 X8 b- o' i) O N
- " V$ @. q; L, D9 t1 k
/ H) p) U* q( l* _& o7 M
// MEX文件接口函数# I2 k7 i3 M# @; _8 O8 \1 X. C
- b+ ]+ x5 f: p |* i# t9 z
. c+ P' T" f+ n& V+ V
4 y6 b1 w" @; R3 H* wvoid mexFunction(int nlhs,mxArray *plhs[], int nrhs,const mxArray *prhs[])' H4 _' ]4 }0 R( ^
7 G7 E* X0 l6 P$ j+ |. i
`1 K5 J7 i3 p9 A
9 u7 f7 L1 |2 _, |+ T" U1 }- h3 p{
* ?" ^8 F" ?3 o! y- b" \! O+ v @# ^7 E+ a) J4 y9 ~
- # a( H9 r2 r9 t+ J
" D) F+ k/ q. e8 ^* {) v+ b8 Z
double *z;- R v. ]' g; v2 Z% Q1 {* @1 b% N
% ]1 m8 I1 s5 I8 C C( S( g+ {
- 3 `, O$ i- U* I& z$ A
o7 A" B! } R) B
double x, y;
- M1 N/ z5 G! t, r! N4 _8 i! f( M, B+ k7 s
- ( b1 c9 z2 t4 H7 u
& t; O! t* y3 W plhs[0] = mxCreateDoubleMatrix(1, 1, mxREAL);* L A) T- e9 h; H4 D$ {8 j1 F0 N
0 g3 ]; z. k, B& _/ q4 _ - ' ?8 `: p+ [, ]
. j1 s& p. C! V8 ] z = mxGetPr(plhs[0]);8 C+ U1 |2 y6 Q' w2 E5 L7 d
+ E# S8 A6 @5 f/ A
- 8 D9 I( ?$ ~+ B8 y3 d
! y2 y- F+ K' f# ]8 m7 }1 f. m x = *(mxGetPr(prhs[0]));
: \* k: m0 Z" H) n3 @3 p
! X& x/ f7 ?# a* k- ~ - / F. U" j4 E5 B: a
9 y) h" Z# p0 y% X: U- Q
y = *(mxGetPr(prhs[1])); v' V' ^0 {: S) V
/ ?5 b3 D: d$ U' E( M! I - 8 H( U; ]: N, O- |
8 ]9 {+ r- Z% n. _
*z = add(x, y);
( s; {( Y" t2 Q( d) Y3 ]& R: t7 L; W2 F3 u8 g! O
- 8 G: W& @1 C$ `( l! K2 y. t G
* \0 y& [2 ]" A1 z5 C ~$ I" q}. f! Y8 u- n* w5 z' F! {+ P
' N4 J5 ^* W% g
. V" U* x2 D# R: Z/ W: P- X
也可以写成: - 1 I! c& l8 G# I5 k, ^ D
8 k( |% {* X! j! B, v% t& p#include "mex.h" // 使用MEX文件必须包含的头文件* e! `( r c- D5 U* d ^; f
, f% E J5 ^( r2 ?: \. _ - 9 F% p$ b; C. x& i; m' n3 l
! Q _6 f2 |& S; d( C8 Z& U X
// MEX文件接口函数0 I \. m3 K0 Q
* k) z! \' O& v$ b+ p+ U0 C. Z+ \
5 |6 U- d( a& e. g( W- |4 Q' I2 N! ~" K' Z# O6 t
void mexFunction(int nlhs,mxArray *plhs[], int nrhs,const mxArray *prhs[])
P; @' g l3 t8 N$ Q/ f5 q
' W$ j5 w$ F, W
% o4 c" F4 i8 q5 e% [: W' W
' O2 m# u/ r/ r" J" g7 A: S{2 n" A# |! L' J
4 w: B- f! [+ n& c" o- ! P, @( |. D$ r$ E; G
. I. c$ j7 S% X6 H5 B* n
double *z;; m0 U; B: b3 ]* Q2 H9 C* N1 t) M2 F
) R# H: q% n2 Z4 \$ H
- * v; | U( j0 l6 u8 u% r1 p* G
7 s0 q; @9 E4 j4 D7 ~. e
double x, y;
! a n, G! r& n% I! [ n) q6 ?+ x, t
: J5 e% i$ `3 X6 D9 W! l9 U
. b1 [% |8 }7 j! Q0 C4 r plhs[0] = mxCreateDoubleMatrix(1, 1, mxREAL);
9 S, u- X$ `' q7 E9 l: f) ~! r& k3 l1 S
- , k" p1 s% T' K" f& E
' |8 l- w" X# U, ]& S z = mxGetPr(plhs[0]);
! j* z9 }" t$ J" A7 Y6 G% Q. S2 |" l
; ^# ~7 k; c$ h - 0 Y+ r+ g$ o: G
) k8 t& |/ d$ k ~ x = *(mxGetPr(prhs[0]));
# ? T. O# J" P1 Z5 B; b( d- t+ Q; M0 U$ v/ |$ h
) Z9 _" j: H5 o R$ u5 q, B' v. \* [
y = *(mxGetPr(prhs[1]));
0 d# x- N" I' ?
|9 ]3 T: y3 w% f- . L" ]' C4 ~! h1 h4 ]
1 S) n4 w9 M7 @, c+ `( \
*z=x+y; w- C0 Y6 n& Y' ^9 m6 R5 _; N
' w$ c% f# l- ~+ v. u) G: ]
, a8 M, F" @, K/ i+ x3 Y
9 @" v6 [% Q% R6 }; P7 C& M- c& q3 P}
2 e" i. F1 g/ y& L3 X m% \/ S6 Q. o h6 x. ?7 e A6 I* J
1 Z* q* o9 x) g* }& y8 y
也就是说执行具体功能可以通过编写一个独立的c语言函数在接口函数里调用,也可以直接写在mexFunction接口函数里 我个人推荐将具体功能独立出来,这样一来: c语言函数负责执行具体功能 mexFunction接口函数负责数据的输入输出(将matlab数据输入c语言环境,运算后再输出回matlab)形式组织 再调用c语言函数
分工明确。 于是关键问题就是如何编写mexFunction接口函数了 void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])下面解释一下mexFunction各个参数的含义(这里看到是void,即无返回值,因为传值是通过指针数组plhs[]传出的) 参数 意义 英文全称 类型
, T* R9 p# P: s/ bnlhs左边输出参数的数目number of left-hand side整型(int)
( _) N; r) b( y+ c y) F ]; z6 hplhs指向输出参数的指针pointer of left-hand side指针数组9 T. G$ i) ]& E& a" q
nrhs右边输入参数的数目number of right-hand side整型(int)) S3 D: l# R( @( y. u" _
prhs指向输入参数的指针pointer of right-hand side指针数组; n, T y+ @: G3 ^
第一个参数nlhs是输出参数的数目,第二个参数plhs是指向输出参数的指针 第三个参数nrhs是输入参数的数目,第四个参数prhs是指向输入参数的指针 其中plhs和prhs类型都是指向mxArray类型数据的指针,prhs这里还加了个const,这里的const跟之前c语言中是一样的,代表不改变,因为prhs是指向输入参数的指针,mxArray这个数据类型是在头文件mex.h中定义的,in fact ,在matlab中大多数数据都是以这种类型存在。 还是拿之前的栗子来解释:
' J W2 h) ~9 p: t6 _4 V" R
/ U/ w+ o. S' w#include "mex.h" // 使用MEX文件必须包含的头文件
/ |6 q0 C3 N# [8 h2 o. O& _, a) J6 ^" A/ a
- 9 j: n, t) w7 @. q1 ?3 P0 p. x8 y; C
4 B8 ~3 S; |' c% U1 o! p
// MEX文件接口函数6 g' n. i- y7 w- t* H
: ~% G7 j7 i* r& x- Z% L3 n% u
: [4 q, p1 ~+ L5 t9 d0 ~' Z; v. c0 F/ d7 I7 p g% x
void mexFunction(int nlhs,mxArray *plhs[], int nrhs,const mxArray *prhs[])9 c% k- k; G- M4 d% j, j0 _
5 i% M( ^. ^4 ^: {2 x/ k( L B
/ I) W, |) Q9 _5 a
- B! }2 M$ J! _ P{3 {8 Z3 d5 T) |' ]8 b% R! ?1 G
) J0 T S. J) V2 u. c- - U- u: f3 b2 r8 m4 S
* o! _% c" q6 @3 }: d
double *z;$ i' y' ^0 t7 W7 ?3 i# H
/ f; U, v1 S6 ~( A# T0 J - # D) {& k! `+ s0 I. }* o9 y
' {& I ]6 c: ?$ c2 N. @
double x, y;2 h2 j0 R: v* x7 {5 Z
) v6 i* ^7 f7 r( l
- ; D9 I- P. q A; O
5 T$ ~& _! C; l plhs[0] = mxCreateDoubleMatrix(1, 1, mxREAL);
9 P {& N! T7 ]/ W$ Y0 P9 k8 C6 H F1 [6 x, n- [5 z- E, W
- + q3 H9 e7 G5 _
+ h! \, @% ~& r2 q$ ^4 b- t7 j% A z = mxGetPr(plhs[0]);
( p& I. N, v5 O# b( O5 e p" ]
3 t! w* C. e1 h8 I - j9 M: U' ^+ y6 U& Z8 [8 p
6 r" i7 t. ?+ [* Z; R% W x = *(mxGetPr(prhs[0]));
) p$ v5 G) D3 d- l4 V+ C( q% \
& a4 \! C& N" W" K1 Y( t& M
) |2 g+ h# p1 D
) o# d2 u' N9 {9 P y = *(mxGetPr(prhs[1]));
9 R/ _, `) H& I. M; q
" T; n6 [ y8 g" o k' \- r
; l' H0 Y6 M' s- L* I- D
7 |1 g3 E7 P* s3 X5 k- I8 b *z=x+y;, B ]) Z( e. N J9 M/ `4 a& E( `
7 F5 w7 R8 {7 O: |' Q
: J/ h5 W: n7 L8 H& A4 x, ]; o. N0 y( `; B4 R1 T* y/ V4 q
}
* g3 `; {. i' c
?2 Y% J% @' |0 p8 S- U* G# T
! k8 A, y* ~9 n% v
在这个栗子中,输入参数是x,y,输入参数是z(虽然没有返回) plhs和prhs其实都是指针数组 prhs[0]代表指向第一个输入数据的指针,mxGetPr代表获得这个指针,后面再加个*就是c语言里面再正常不过的按指针取内容了 所以就这样x,y通过下面这两句传入到了mexFunction中 - 7 L; T2 h0 f/ S9 g% W
" l- d; \2 b5 c
x = *(mxGetPr(prhs[0]));
0 z3 v% m1 O) ^6 f r* J L) |# X0 x4 {2 ~ ?8 M: J) D' i: i
- & ^( y+ E: `; \7 l$ V* Y& N
- L8 d1 w7 L( p# o/ C6 ay = *(mxGetPr(prhs[1]));
2 @, r6 d6 F) C& y) R
* O; \- ?/ i6 q+ ^. e7 e: @- J; w
mxGetPr函数的功能是从指向mxArray类型数据的指针prhs[0]、prhs[1]中获得了指向double类型的指针 另一个函数是mxGetScalar,Scalar即标量,功能是把通过prhs传递进来的mxArray类型数据的指针所指向的数据(标量)赋给c程序里的变量。前面的mxGetPr是传递矢量的,否则矩阵或者向量就没有办法传进来 这里由于传入的每个参数是单个值,于是也可以用mxGetScalar改写: - 6 j6 w0 d7 `7 Z+ k& s
, P& Y2 w2 \1 @
#include "mex.h" // 使用MEX文件必须包含的头文件
! k* I) L; H$ b8 g- ^/ G! c$ e y0 ?
5 i& c! T* S3 p" x: `6 h! y# V/ f1 ~ - * v6 t* Z( f/ a& M
7 B$ Z% c( a- Q1 t1 b6 k9 G! @// MEX文件接口函数
+ ?8 G9 L" ^$ P' C v" f& r" R0 s/ v) F9 I5 T
( f6 V6 V/ V. J2 T* E
: ]" i. n( `' f9 r: p" T. rvoid mexFunction(int nlhs,mxArray *plhs[], int nrhs,const mxArray *prhs[])
6 h4 u' M/ B8 T" u
8 T0 D0 P, z0 S0 h* [( v6 t8 h- _/ Y% Y4 h* r2 Y# J, A" ?4 {
1 h; n# N5 \+ g4 M
{- {9 }. h t% s# w9 i
: W! l- P0 }- @) n
2 ~$ j5 d3 w2 D5 D0 R: s9 o: w3 x9 Z5 x9 l g3 Z
double *z;) b1 r1 V! [& v$ v( M
3 @( d1 Q k: U# p0 @3 T" |
& W% V" k3 a' o7 ?0 s% \& z' m& }% R) L4 o K( U
double x, y;
% @8 l! d* _- `) s( N2 o- u2 Q. ?2 V- P/ @3 X
- # ?) n2 C+ n* h, _0 g' ~
2 D4 }( c$ ^. @ plhs[0] = mxCreateDoubleMatrix(1, 1, mxREAL);
: q) t; r7 w: _8 N
3 b; |, _+ r' b4 E
; ^- A- m) C( ^ U% m
# o8 q k4 @7 K p7 F/ e z = mxGetPr(plhs[0]);( O% ^( P$ v) F J+ C- c
0 R- q( i( l6 [0 P9 o0 ^- 5 ?$ x2 O0 g& b& U3 u1 ~
- O0 ]2 r6 l2 z" a5 R! x M0 n x = mxGetScalar(prhs[0]));- C8 b b" e% ]& ]0 f. ~
' X: ~2 K/ s' Y
- # ?9 T( g# S, X- }9 F2 W: a
: y, ]% Q& V9 `; B2 r: B+ ]( {. y
y = mxGetScalar(prhs[1]));
% K8 x& ]. m; ]3 s! q
: W+ C( K% |8 f7 j& ^' A$ u$ P" p* t0 e - ; ?, Z% ^4 W+ ^* @) e2 D
) ]6 v/ z% `* U1 Q- v* w
*z=x+y;
, W) e; [+ T2 c8 @" k
) r2 N! E8 E* A% r, Q, P2 F - 3 V# I7 [! J3 |* z: I1 y
7 `0 e8 ^9 R/ V0 l% P* o
}
v; Q# e: W& U6 D* l$ [ _8 _- h) Y$ s% {: g
2 \8 q$ G% |4 O6 T% _
(注意:输出参数因为需要通过指针传出,因此这里z必须用mxGetPr这个函数来从mxArray指针获取double指针) 但是这样还是有个问题:如果输入的不是单个的数据,是向量或者矩阵,即使我们通过mxGetPr获得了矩阵或者向量的指针,但是我们假如不知道矩阵的shape,还是不好取值或者计算,所以这里又有两个函数mxGetM和mxGetN可以通过传入参数指针获得传入参数(矩阵)的行和列数。 需要注意的是: 在matlab中矩阵的第一行和第一列的序号是从1开始的,而在c语言中是从0开始的,而且在c语言中的一维数组存储矩阵的数据时,是一列列从上到下,从左到右来存储的,也即 matlab中一个m*n的矩阵M(i,j)对应于c语言中一维数组N中的N[j*m+i]
举个栗子:
- H) a2 B5 m1 V8 k# j/ R
- t: p- [$ E2 ~# U5 g/ N#include "mex.h"- X' X7 d% R* ~4 c4 h% Z5 {) W
/ R. }/ [ \) `6 C6 u- ) C2 J9 n: J3 i9 g
; I) u+ B6 T) [% i" I% K void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]){* Y" M$ x( w4 ` @; q3 E: i1 _3 W+ l
) d9 O1 Z& I5 M+ ]" K' Z: i3 | - ) H% Z& d/ h) R7 L
" I+ K. X# D6 L7 T5 l; t
' g! P8 H) \7 d( O3 q, r
# ^& ?/ r5 @4 ]% k - 8 y, q5 S# f5 ^4 r" h, f
% `" o( G; }1 ~( W/ c" c5 ndouble *data;/ R+ _$ F/ K8 V2 L) e/ g
' e+ o! s- e6 O }. _" v
- + p h# P9 D3 a9 i2 _9 B
. T& \* N; d) \2 z) A9 M' x7 W
int M,N;
/ U2 W% p5 R. J
/ [) J* j2 ]4 y7 u& a6 ^ - 5 Z0 |! T( ?- j% i: v2 @( S% F7 t
! J: |, z* e( z: r
int i,j;
# X# p9 x* g# L* k" \0 }
% k9 K9 _" I7 ^/ g9 C# @
% Y" l+ B$ }6 ]; Q. k, Z L" C. M0 {/ |0 V3 l! R8 O$ A
data=mxGetPr(prhs[0]); //获得指向矩阵的指针
& K, _, g& ?5 k: M3 C3 _! N- V/ z# g" t. Z; L
/ D! f6 J; S/ a9 W# E" C n! U7 z1 k9 B( r# S+ u& H0 _+ [8 o
M=mxGetM(prhs[0]); //获得矩阵的行数
. q7 [2 n' ^ j' O9 ?# r4 }: P- p- A
$ w; s$ c1 \: g6 c
8 ^! W9 D3 g. a% i3 o1 ~N=mxGetN(prhs[0]); //获得矩阵的列数
3 X! }3 e* W- n Q' ~1 P5 |5 Q1 ~; F4 D( m) z3 P* Y. C
- ) l5 Q( U# J) y
% b0 u! T0 @7 B: a# y% Yfor(i=0;i<M;i++)' n, _7 q% O0 l+ L
1 l5 v! c2 J f) ^: A/ O
- M7 I. P& r5 J3 }3 _9 s, Q
" `. J4 h% [9 r( ?& A
{
8 M- l% q& ~6 {; L9 f6 N6 x0 p2 q5 z, |7 j: j
- k* i; ^) J2 h- a6 I
3 i$ G: N6 Y( {& Y6 G! ]( Q: P
for(j=0;j<N;j++)4 ~; ~2 d# E( m) r- j0 g. d
+ p, P6 \3 B: X: j
/ }4 k/ H$ u. _
7 P u d1 ?% |7 T9 x mexPrintf("%4.3f ",data[j*M+i]);
) s" |, ?3 `5 U7 ~: x- ~$ `) T/ B+ s" I: y( P# p# d/ g9 l
; z3 C3 [) g" a, B6 V0 ]
* r9 L' J5 y2 ?- f2 I mexPrintf("\n");
0 ^' X% E0 Y4 j1 H }' S
; D$ C5 y" i9 K" t9 h1 Z8 I4 W- # o1 ~2 l. E; B: x
& J8 u& [; {) V0 _# g% y$ y# ]
}& L$ V$ @. K3 G& A6 Q& o7 m1 m% T2 i3 L
* W/ q7 u/ B$ s1 i" {& c
- W- H* w: B3 ]
c/ `7 m( S* t* C2 t }
% l8 F0 ]: x* U0 j5 ~
9 N0 S5 ]2 l. z3 f$ l: P; f
4 }2 T, j7 O, W: y% O
假如是一个形如[1,2,3;4,5,6]的矩阵,则执行上述后会先后打印出1,4,2,5,3,6 以上讲的都是输入参数,由于输入数据在函数调用前就已经在matlab里申请过内存,由于mex函数与matlab共用一个地址空间,因此通过prhs传递指针即可传入输入参数。但输出参数却需要在mex函数里申请内存,才能将指针放在plhs中传递出去。由于返回指针类似必须是mxArray,所以matlab专门提供了一个函数:mxCreateDoubleMatrix来实现内存申请,函数原型为: mxArray * mxCreateDoubleMatrix(int m,int n,mxComplexity ComplexFlag)m,n分别是待申请矩阵的行数和列数,需要注意的是为矩阵申请内存后得到的是mxArray类型的指针,就可以放在plhs[]中传递出去了。但是对这个矩阵的处理(包括赋值)却需要在mex函数或者c语言函数中完成,这就需要通过前面的mxGetPr或者mxGetScalar。使用mxGetPr获得指向这个矩阵的double类型指针后,就可以对这个矩阵进行各种操作和运算了。 还是拿这个栗子讲,这里由于输出是一个数,于是m,n都是1,通过mxGetPr进一步获得指向double数据类型指针z
) j6 E+ E# f( \. } q+ ~8 X
8 J: Z8 Q9 ]0 E: v3 x' m! k7 ^ B5 G8 m9 J7 K5 S$ x( N
- L/ \' ?8 }* X5 p5 u
: U z( X9 X+ s/ e( Z) d7 C
% c5 v1 F5 H; L/ J& C/ Q7 x J# A double *z;
8 k& _" m, z+ O; F- k; }# @5 F
' f( z. x6 l; s- 9 J3 x" ]8 L, S
4 }- P; V% ^% u% T4 Z6 t$ s3 Y7 l plhs[0] = mxCreateDoubleMatrix(1, 1, mxREAL);7 S1 X' W% ~# | t& Q
# g+ D5 R$ A, |# p
3 k/ C$ t; C' G$ y' K& C
1 Y9 \- }. V7 f- ]; p z = mxGetPr(plhs[0]);
0 T3 e3 @+ R" Z" r( y; k2 L6 G3 C
; I1 u; w+ u5 T+ k* s- 6 {2 u" E8 [7 b$ n6 v2 x
. j4 ^* p6 j2 I q+ N. Q) `# K
x = *(mxGetPr(prhs[0]));
: r7 s7 k+ I& O9 d7 y1 c6 l) G" M* a' B7 s
- 6 f$ e" e, N! `! o9 K( E8 Y3 V$ y: ^
& a$ P5 n. Z% _4 Y! M, m0 T4 x' j9 L
y = *(mxGetPr(prhs[1]));
- N }9 D5 v, j8 U& Y" r: [3 _: D( H7 k1 l$ a4 w5 ?- l; Y s0 q
. O$ P, A$ c# i, J, [( D) h% r L1 W; A$ T/ d* O/ S
*z=x+y; d8 c. v" L/ Q2 m9 ?' \8 i2 z
4 @' `. g- A$ R5 N' p1 x: J5 y* I8 R; _, z# v5 {( V( G& `/ w
当然,matlab里使用到的并不只是double类型这一种矩阵,还有字符串类型,结构类型矩阵等,并也提供了对应的处理函数。 5 x; f9 ?. t' t0 q+ r% Q0 z
|