QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4597|回复: 10
打印 上一主题 下一主题

[课件资源] Matlab调用c程序

[复制链接]
字体大小: 正常 放大
梦溪517        

18

主题

5

听众

230

积分

升级  65%

  • TA的每日心情
    开心
    2014-2-12 10:47
  • 签到天数: 52 天

    [LV.5]常住居民I

    群组Matlab讨论组

    群组C 语言讨论组

    群组学术交流B

    群组学术交流A

    群组2013年数学建模国赛备

    跳转到指定楼层
    1#
    发表于 2012-8-28 20:47 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    + v0 R2 s% ]$ U4 X
    Matlab调用c程序
    / q9 f, ~) r( d  S7 Z2 ]文章来源:不详 作者:佚名
    1 R& Q4 ^/ ^5 s4 g
    ( a3 Z  J! C4 o; S/ I--------------------------------------------------------------------------------! f& H2 V/ e9 _/ J, Z
    & c" J! W5 w" Z6 k6 k
    该文章讲述了Matlab调用c程序.2 p* f- P- {* I9 ?1 b( Q
    3 o; W' M3 ~. R+ v2 z8 ]0 Y
    方法:
    - d* a" \7 v! G0 {+ y# F第一步:要先在matlab中安装c程序编译器,步骤如下:
    , k6 P1 l, b+ o! b) m键入命令:mex -setup% o3 j0 W$ V1 c9 T
    选择c/c++编译器;
    9 _+ ?$ e' D5 e9 W& \0 w选择c/c++编译器版本;
    : V( l' e% D" R/ K2 L确认。" N; \6 a) M; Y! H. I: p+ F
    第二步:键入:mex *.c7 D" s+ |" H9 u
    ; y) z/ y& }& G' t# H
    *********************************************************************************************************************************************9 _. K3 Q4 e( H) Y# O  v

    $ e  v+ |" t+ H$ v% H7 A1 y/ A实例介绍:【转】
    ! ~5 a0 }' Q% ]" V0 Q) H
    1 \; w" X! T" B: Y如果我有一个用C语言写的函数,实现了一个功能,如一个简单的函数:3 Y, F% C# v( [. @/ P% Q
    double add(double x, double y) {( S; b5 ?  U3 s
     return x + y;* U4 f! N  Z2 g# y2 q, d0 n! j
    }
    - M9 J8 y2 K! x! f* I5 j) r) [现在我想要在Matlab中使用它,比如输入:7 {; [8 F- D! A4 A& \% m4 J
    >> a = add(1.1, 2.2)1 F' L' W& b& U- k
    3.3000* y9 E) a5 w% n( t$ D. P8 `
    要得出以上的结果,那应该怎样做呢?& E1 o/ G5 v# G. E0 D) \* i
    解决方法之一是要通过使用MEX文件,MEX文件使得调用C函数和调用Matlab的内置函数一样方便。MEX文件是由原C代码加上MEX文件专用的接口函数后编译而成的。+ P- ~4 h) W# N7 Q5 g6 m- J
    可以这样理解,MEX文件实现了一种接口,它把在Matlab中调用函数时输入的自变量通过特定的接口调入了C函数,得出的结果再通过该接口调回Matlab。该特定接口的操作,包含在mexFunction这个函数中,由使用者具体设定。1 z/ V( T3 m, U; ?# H% T  h4 D
    所以现在我们要写一个包含addmexFunctionC文件,Matlab调用函数,把函数中的自变量(如上例中的1.12.2)传给mexFunction的一个参数,mexFunction把该值传给add,把得出的结果传回给mexFunction的另一个参数,Matlab通过该参数来给出在Matlab语句中调用函数时的输出值(如上例中的a)。6 k& h/ Z* W9 k* N6 G8 p- ^9 A* ]
    比如该C文件已写好,名为add.c。那么在Matlab中,输入:2 d; I3 n$ r) k( |/ q% `( z
    >> mex add.c
    " W! F; h, V' P就能把add.c编译为MEX文件(编译器的设置使用指令mex -setup),在Windows中,MEX文件类型为mexw32,即现在我们得出add.mexw32文件。现在,我们就可以像调用M函数那样调用MEX文件,如上面说到的例子。所以,通过MEX文件,使用C函数就和使用M函数是一样的了。
    / i2 \4 Q% _5 _. |  B. x我们现在来说mexFunction怎样写。
    5 q) T3 u* G- `9 G" x+ r7 N# vmexFunction的定义为:9 a7 x2 j# k% m
    void mexFunction(: c; F4 X2 Q/ [' B( v4 Q
         int nlhs,+ R( V7 t2 o& r& N9 A. n8 u; K0 m/ F
         mxArray *plhs[],
    . S3 ]9 [% C' u* L! K( C6 M     int nrhs,
    # ^; d& p' `8 Z" R/ B     const mxArray *prhs[]) {6 g( t" M& O) k2 y9 G

    - V8 |6 E1 H- ^# B" `' s' G$ [( i- |}
    . d" f! z, L. l; i4 h可以看到,mexFunction是没返回值的,它不是通过返回值把结果传回Matlab的,而是通过对参数plhs的赋值。mexFunction的四个参数皆是说明Matlab调用MEX文件时的具体信息,如这样调用函数时:
    9 u# R8 d$ r. s9 s>> b = 1.1; c = 2.2;
    + i! `! ~0 d+ L# O: B$ L' Z>> a = add(b, c)
    7 a+ p: Q0 L1 n8 J3 _6 ~7 K) D, amexFunction四个参数的意思为:
    % \* B  {; u( j+ Z$ S2 k$ ]nlhs = 1,说明调用语句左手面(lhsleft hand side)有一个变量,即a
    8 G% @9 U8 Z! pnrhs = 2,说明调用语句右手面(rhsright hand side)有两个自变量,即bc
    # S5 O- U* n3 f  C+ Dplhs是一个数组,其内容为指针,该指针指向数据类型mxArray。因为现在左手面只有一个变量,即该数组只有一个指针,plhs[0]指向的结果会赋值给a6 H& p/ z% A& r/ Z& b+ h
    prhsplhs类似,因为右手面有两个自变量,即该数组有两个指针,prhs[0]指向了bprhs[1]指向了c。要注意prhsconst的指针数组,即不能改变其指向内容。% |( s2 T8 }6 a; A) ~
    因为Matlab最基本的单元为array,无论是什么类型也好,如有double arraycell arraystruct array……所以a,b,c都是arrayb = 1.1便是一个1x1double array。而在C语言中,Matlabarray使用mxArray类型来表示。所以就不难明白为什么plhsprhs都是指向mxArray类型的指针数组。% D+ m( z7 d' v2 q5 n
    完整的add.c如下:
    , L+ u: p0 x7 Y8 v' t// add.c. z( O2 p: c+ C
    #include "mex.h" // 使用MEX文件必须包含的头文件 // 执行具体工作的C函数
    - H# f( z! `  K4 gdouble add(double x, double y) {$ Y! ]1 e) |! V* B* S+ Q& s
     return x + y;1 D+ w9 X5 S' a! Z8 F4 o3 W
    } // MEX文件接口函数' L6 p% {, n/ l! W
    void mexFunction(
    / Z( _' d$ j. b( B int nlhs,
    2 g7 y$ p) Z+ F/ H  X+ K2 {- `2 l mxArray *plhs[],# R( G. W2 F* \
     int nrhs,0 b8 n* j. g0 W$ v( _9 Q) t
     const mxArray *prhs[]) {
    ; G2 E3 ]% t- l; f! m double *a;
    $ P& T8 n: q7 M) _ double b, c;+ j  J( N5 {; V& q% \0 r) \& v
     plhs[0] = mxCreateDoubleMatrix(1, 1, mxREAL);
    " h5 x" ^( `2 R# z a = mxGetPr(plhs[0]);
      B3 Z0 r2 J2 R! w9 r b = *(mxGetPr(prhs[0]));
    + e. i8 J" v/ [ c = *(mxGetPr(prhs[1]));
    & c3 t; T1 I2 Y7 ~! k0 D, X *a = add(b, c);
    8 D% m/ t% Z' u} 4 x* p2 A: j" W8 J0 t) q" K
    mexFunction的内容是什么意思呢?我们知道,如果这样调用函数时:& J* T/ E1 j5 O; ?# R/ c
    >> output = add(1.1, 2.2);
    6 E, X. A3 O3 y* g5 C: @在未涉及具体的计算时,output的值是未知的,是未赋值的。所以在具体的程序中,我们建立一个1x1的实double矩阵(使用mxCreateDoubleMatrix函数,其返回指向刚建立的mxArray的指针),然后令plhs[0]指向它。接着令指针a指向plhs[0]所指向的mxArray的第一个元素(使用mxGetPr函数,返回指向mxArray的首元素的指针)。同样地,我们把prhs[0]prhs[1]所指向的元素(即1.12.2)取出来赋给bc。于是我们可以把bc作自变量传给函数add,得出给果赋给指针a所指向的mxArray中的元素。因为a是指向plhs[0]所指向的mxArray的元素,所以最后作输出时,plhs[0]所指向的mxArray赋值给output,则output便是已计算好的结果了。
    : W+ H4 i' z7 n$ Z( L上面说的一大堆指向这指向那,什么mxArray,初学者肯定都会被弄到头晕眼花了。很抱歉,要搞清楚这些乱糟糟的关系,只有多看多练。
    ' t4 Z+ `+ ^& s实际上mexFunction是没有这么简单的,我们要对用户的输入自变量的个数和类型进行测试,以确保+ _! M1 P; o9 l: u( ^
    输入正确。如在add函数的例子中,用户输入char array便是一种错误了。
    ) ~4 E- c8 @4 C& s9 u从上面的讲述中我们总结出,MEX文件实现了一种接口,把C语言中的计算结果适当地返回给Matlab罢了。当我们已经有用C编写的大型程序时,大可不必在Matlab里重写,只写个接口,做成MEX文件就成了。另外,在Matlab程序中的部份计算瓶颈(如循环),可通过MEX文件用C语言实现,以提高计算速度。% O. _/ u6 L. @3 D  @# c: g- w

    1 v$ ^* I: Z0 T1 f*********************************************************************************************************************************************
      Y5 p( u! j/ S( c0 r5 w$ m" @- R8 G9 y# v9 w7 u/ e0 K
    mex 的目的,
    0 |3 w( B& x# N" R5 T) x; Q& C: T8 }* m4 s0 [7 ~
    通过C/C++语言编写代码,Matlab中将其编译成mex文件主要可以做以下几方面的事情:
    5 ^8 S# G2 R+ A" W) I$ d2 d, q% C+ I
    1、加快程序的执行速度. Matlabfor上如老牛拉车的速度确实让人抓狂.8 r+ i/ b* c: {" g$ E$ {

    . t) S3 r' P8 {2、将Matlab作为C++的开发调试环境.尤其是有大量数据需要处理时,Matlab观察其中间结果十分方便.9 t$ u( ]1 e/ d7 a# w& Z& A" d8 U
    . ]& a. M! b6 x  x' J# H: K, }, R% V
    3、据称可以弥补Matlab硬件设备接口的薄弱环节.2 e! I* I: ^# M& A6 q5 E
    % n4 u& i. @: R( w" \4 t9 a
    今天写了第一个使用MEX.
    # B& ^2 c) P9 K& r3 \% e6 Z* C
    ' K7 y5 m" t9 Z, _. W8 y一个简单的对Matlab普通数值矩阵的操作.1 R; z8 ]+ S& ]

    3 [+ `& O2 y4 G3 w# V/ G! g( P6 P其中Matlab规定的与操作系统版本有关的mwSize,mwIndex, size_t32位系统上其实本质上就是int,所以
    ' x) D$ O/ i# }8 P& k% g
    0 [: m# b: |. \6 H! [- o- ^一律用int代替.
    / Q. [* H5 y% c" P2 G, Q( V( l; `( Y+ R: B. a7 o: ]/ q0 k
    #include "mex.h"" Z. N- G) o  q, l3 s; f- z/ s
    #include <iostream>
    6 l& ]3 a: {* b3 W) X- S  D" d- N2 h5 I% x2 L; @7 r3 e
    void mexFunction(int nlhs,mxArray *plhs[],int nrhs,const mxArray *prhs[])
    " k% ^- f# }4 d# j7 S{
    1 i$ K; L3 ~+ I; D$ `- s+ }- i$ Q# n3 g! f& H- m* `
    int i,j,k;5 v) z( i3 {1 a0 J6 \% F' ~- X% v" q
    int index;) q9 ?) i' a; w! p5 _1 x$ I. s5 |
    double* pr=NULL;, g; L2 k8 M/ A1 b7 t, e& r6 u8 H# V0 O
    double* pi=NULL;
    $ r9 Q+ @8 r4 N3 j5 j! Pint M,N;
      b5 j' q) i0 s/ m+ f0 [int ndim;4 q  b1 N9 k( ]7 E
    int dims[2];
    2 t7 W5 X8 b1 j) D4 Sfor (i=0;i<nrhs;i++)
    $ Y1 k/ O7 X. }8 o  g# k5 _0 ?{* \/ b. ?$ I, J/ P
       if ((mxIsDouble(prhs))&&(mxGetNumberOfDimensions(prhs)==2))
    6 r. e: v' z+ H# S, V1 e5 I   {
    + M; n0 [; y# n4 q* a) k% c0 ?8 I    pr=mxGetPr(prhs);
    3 p. b+ Y& ?# @  Q* C    pi=mxGetPi(prhs);
    ; S6 H: }, B) F, j3 R# {6 V# ?- P' _/ P    M=mxGetM(prhs);
    ) u1 N, y# ]; Z    N=mxGetN(prhs);
    5 M/ i& @( ?' l9 B  t* M& I2 M    ndim=mxGetNumberOfDimensions(prhs);  L$ r3 T9 [! H3 m

    ' @! I: U$ }" F, q0 t- u) q( C    mexPrintf("变量%d:\n",i);
    % a% P+ `; F6 [& L5 c" x    for (j=0;j<M;j++)  e3 c. F# X+ _  R
        {% `7 p. G7 z, k, k1 g6 z
         dims[0]=j;5 q7 E' @/ V3 c% f* O
         for (k=0;k<N;k++)  m- K: y2 J  a$ @+ V( O* N5 X
         {
    ' H7 F' m$ E2 }4 e; P" P      dims[1]=k;1 ^( l! q& {* V! Z& S* R
          index=mxCalcSingleSubscript(prhs,ndim,dims);( ]1 G( u# s2 D" f& f% n& l6 {* o& Y
          if (pi==NULL)0 B3 C. P* w! R* E5 c
          {
    & k; l% T) e6 D2 W+ {( o/ O# \" V       mexPrintf("%6.2f",pr[index]);5 I3 K& Z+ ?; Z% o( {- ~. c$ L/ Q
          }
    9 ^0 p+ q( e1 @* K. ~2 r1 A' P) z      else{, z/ Y4 D. Y7 o( W, {1 e$ {, I
           mexPrintf("%6.2f+ %6.2fj",pr[index],pi[index]);9 k: m0 C7 V9 r4 m5 n
          }% J7 ~1 _# E  d4 W
         }
    , \0 p: ]3 j, Z3 O4 g9 F     mexPrintf("\n");) Q- y1 ?2 I- g8 }
    0 F% i3 p& g+ Z' b6 u; [  C" T
        }! Y2 ^' M6 R; C
      7 q4 u( t* q4 Y5 }9 y8 R& r
       }" i) Q# v$ a: k! @
       else{
    ' L* ?$ d! Z( X+ |) T  Y! h8 x. \8 q    mexPrintf("input NUMB %d matrix is not 2 dims&double numerical array\n",i);+ G' j% v. t7 K0 C2 j0 `
    }5 y7 b4 B9 b8 W- B& F0 j7 [

    4 x  q8 J( ~3 t! T1 b
    - |; K, C4 n' B; t7 C}
    / ^5 x- M9 k8 l8 E8 @1 K+ L3 H1 _1 o) w& \) P" J- p
    }( p9 a8 h. R0 P( M  n; B7 W

    5 `4 k; N6 L5 j" ~6 v3 |; `Result:0 b! X" b! m# `" S$ [

    & P$ s, }5 G0 V  J>>mex test.cpp9 |; g( H5 W7 `, t0 o, _
    >> test(a,b,c)
    - o0 h$ t, o  V3 D/ v变量0:
    $ H2 v/ n" l" S" }0.35 0.62 0.837 {# G' c- w! o+ P9 }& o0 q* A
    0.20 0.47 0.59( i5 W/ M  K$ q" \* g; a( V  b
    0.25 0.35 0.55
    " o, ^0 m- V1 c1 \3 ~& E% y变量1:
    & N5 Z4 @0 k$ E3 W/ X6 I' |- c0.92 0.38 0.53 0.57. l% p2 k0 B  T0 m/ ]
    0.29 0.57 0.78 0.473 Z# j3 Q/ L1 m( h5 v' ]
    0.76 0.08 0.93 0.01
    0 p8 m, u  V) {' A4 q9 f. \" G3 L: E0.75 0.05 0.13 0.34, o) c3 ~' N' k& j7 p& K
    变量2:
    - C) W& W3 P& C0 X9 r  l0.16+   0.87j 0.60+   0.43j 0.45+   0.14j 0.83+   0.85j 0.11+   0.08j% t6 m  ^) G0 z) w  ]5 F
    0.79+   0.08j 0.26+   0.91j 0.08+   0.87j 0.54+   0.62j 0.96+   0.24j. t# I' F; T& u3 K/ ]/ F6 ^3 h
    0.31+   0.40j 0.65+   0.18j 0.23+   0.58j 1.00+   0.35j 0.00+   0.12j
    8 R, e) b' E9 W6 a% M0.53+   0.26j 0.69+   0.26j 0.91+   0.55j 0.08+   0.51j 0.77+   0.18j) n2 T- r  o7 ~+ n
    0.17+   0.80j 0.75+   0.15j 0.15+   0.14j 0.44+   0.40j 0.82+   0.24j
    ! C0 C3 a, }3 Q! g>> help test7 {0 z+ ^# D) W. k
    本程序用于调试mx______函数.0 W& M+ K% G0 w- X# v' ^3 s

    * `* T5 r; d; ~7 O6 R5 H" T
    1 a  _6 T6 \$ l) B本文来自: 高校自动化网(Www.zdh1909.com) 详细出处参考(转载请保留本链接)http://www.zdh1909.com/html/matlab/14744.html
    ' _! d9 g0 N" H! H: i( M9 n" J$ w& }% P; G' ~0 S' p/ K0 H) m
    下面是其附件,内容一样,方便下载 Matlab调用c程序.doc (41.5 KB, 下载次数: 10)
    zan
    已有 1 人评分体力 收起 理由
    天海星云 + 5 很不错的,鼓励共享。

    总评分: 体力 + 5   查看全部评分

    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信

    32

    主题

    50

    听众

    3006

    积分

  • TA的每日心情
    慵懒
    2024-7-11 11:07
  • 签到天数: 543 天

    [LV.9]以坛为家II

    社区QQ达人 邮箱绑定达人 发帖功臣 新人进步奖 风雨历程奖 最具活力勋章

    群组小草的客厅

    群组数学建模认证项目实训

    群组我们一定会赢

    群组哈尔滨工业大学建模团

    群组聊天

    回复

    使用道具 举报

    0

    主题

    5

    听众

    101

    积分

    升级  0.5%

  • TA的每日心情
    开心
    2014-4-20 15:49
  • 签到天数: 4 天

    [LV.2]偶尔看看I

    群组Matlab讨论组

    群组2011年第一期数学建模

    群组LINGO

    回复

    使用道具 举报

    0

    主题

    7

    听众

    272

    积分

    升级  86%

  • TA的每日心情
    开心
    2014-9-22 15:14
  • 签到天数: 55 天

    [LV.5]常住居民I

    回复

    使用道具 举报

    tequila33        

    0

    主题

    6

    听众

    78

    积分

    升级  76.84%

  • TA的每日心情
    奋斗
    2013-2-4 10:21
  • 签到天数: 8 天

    [LV.3]偶尔看看II

    自我介绍
    想试试、、
    回复

    使用道具 举报

    lieove 实名认证       

    4

    主题

    7

    听众

    122

    积分

    升级  11%

  • TA的每日心情
    无聊
    2014-6-11 18:56
  • 签到天数: 23 天

    [LV.4]偶尔看看III

    群组Matlab讨论组

    群组数学建模

    群组数学建模保研联盟

    群组第四届数学中国美赛实

    回复

    使用道具 举报

    2

    主题

    8

    听众

    84

    积分

    升级  83.16%

  • TA的每日心情

    2013-2-16 14:17
  • 签到天数: 9 天

    [LV.3]偶尔看看II

    自我介绍
    数模
    回复

    使用道具 举报

    墨羽飞        

    0

    主题

    6

    听众

    480

    积分

    升级  60%

  • TA的每日心情
    奋斗
    2015-8-6 10:29
  • 签到天数: 143 天

    [LV.7]常住居民III

    社区QQ达人 邮箱绑定达人

    群组第四届cumcm国赛实训

    回复

    使用道具 举报

    fjnanyuan        

    4

    主题

    9

    听众

    130

    积分

    升级  15%

  • TA的每日心情

    2013-5-10 08:19
  • 签到天数: 30 天

    [LV.5]常住居民I

    自我介绍
    我不恨数模
    回复

    使用道具 举报

    2

    主题

    6

    听众

    117

    积分

    升级  8.5%

  • TA的每日心情
    开心
    2013-9-18 23:25
  • 签到天数: 53 天

    [LV.5]常住居民I

    群组Matlab讨论组

    群组2013认证赛A题讨论群组

    群组数学建模

    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2026-9-2 09:06 , Processed in 0.770480 second(s), 114 queries .

    回顶部