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

matlab与c语言混合编程

[复制链接]
  • TA的每日心情

    2019-11-20 15:22
  • 签到天数: 2 天

    [LV.1]初来乍到

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

    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) H
      8 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) Y
      3 ]& 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 E
      9 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 ~+ L
      5 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  F
      1 [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 D
      0 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' o
      7 ?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: M
      3 C3 _! N- V/ z# g" t. Z; L

    • / D! f6 J; S/ a9 W# E" C  n! U7 z
      1 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 f
      6 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 c
      6 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  L
      1 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

    该用户从未签到

    2#
    发表于 2020-12-10 15:10 | 只看该作者
    matlab与c语言混合编程
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

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

    EDA365公众号

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

    GMT+8, 2025-7-31 10:34 , Processed in 0.171875 second(s), 27 queries , Gzip On.

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

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

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