QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4580|回复: 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
    " a) [; ~4 l8 {
    Matlab调用c程序
    ; e% u  W% M# {文章来源:不详 作者:佚名 3 |! D' H$ _: I+ W$ f2 h% [

    9 \% `( r9 c( o--------------------------------------------------------------------------------
    % ~' b# y, j7 L- q0 q5 w0 z) w3 `( s+ o1 r- }
    该文章讲述了Matlab调用c程序.. d% {+ d2 r, D7 }$ z( B

    2 j" P+ K: f! w& X  h+ n方法:; n) v( F: D6 t9 K. f9 Z5 v
    第一步:要先在matlab中安装c程序编译器,步骤如下:1 |( O, {6 E7 Y: @! ?  e( [; N( `' L
    键入命令:mex -setup
    ! k1 p$ K- q8 l) n' U& f选择c/c++编译器;
    % Y4 n0 O8 w$ C; m+ t0 N# Q选择c/c++编译器版本;
    ' W5 z! X9 d8 w( D确认。" G; l) m/ E* Y! w6 O
    第二步:键入:mex *.c$ V* |; T$ j% ?! R$ t+ b

    % i8 t2 l9 L& Z3 q2 _*********************************************************************************************************************************************
    1 S' c% N. c" s/ t" c) L
    ) N9 y1 K: L1 b0 |% Y实例介绍:【转】
    . V; \3 G1 `  q
    7 }3 L& x9 G) r" V* Y& @0 g如果我有一个用C语言写的函数,实现了一个功能,如一个简单的函数:
    ( F5 F% f4 H5 p/ ndouble add(double x, double y) {
    , t# n1 M" m3 o: t return x + y;7 Q$ i. d) m/ s: G3 o# y. x
    }9 I( z, P% l- [% j" v
    现在我想要在Matlab中使用它,比如输入:3 x# Q& z9 \8 O/ E% M# c9 G
    >> a = add(1.1, 2.2)4 R* `) Q3 e! |# g! I5 Y
    3.30007 @' ?/ F- M! Z- O/ k% v3 C. k! x
    要得出以上的结果,那应该怎样做呢?* j! p& ^+ }  h& g( p$ J5 q) K" \
    解决方法之一是要通过使用MEX文件,MEX文件使得调用C函数和调用Matlab的内置函数一样方便。MEX文件是由原C代码加上MEX文件专用的接口函数后编译而成的。9 {8 A& U. d# M, m+ r8 H
    可以这样理解,MEX文件实现了一种接口,它把在Matlab中调用函数时输入的自变量通过特定的接口调入了C函数,得出的结果再通过该接口调回Matlab。该特定接口的操作,包含在mexFunction这个函数中,由使用者具体设定。0 j' }( k; p7 i1 ]5 s+ ^
    所以现在我们要写一个包含addmexFunctionC文件,Matlab调用函数,把函数中的自变量(如上例中的1.12.2)传给mexFunction的一个参数,mexFunction把该值传给add,把得出的结果传回给mexFunction的另一个参数,Matlab通过该参数来给出在Matlab语句中调用函数时的输出值(如上例中的a)。
    6 F5 e" ?+ r- `0 a& v比如该C文件已写好,名为add.c。那么在Matlab中,输入:# d9 m. O1 M% H" m; B* }
    >> mex add.c
      V1 C# ~2 e) c! m# |就能把add.c编译为MEX文件(编译器的设置使用指令mex -setup),在Windows中,MEX文件类型为mexw32,即现在我们得出add.mexw32文件。现在,我们就可以像调用M函数那样调用MEX文件,如上面说到的例子。所以,通过MEX文件,使用C函数就和使用M函数是一样的了。
    ; O6 T3 ?. h* V/ Z8 ~& g6 u6 Y我们现在来说mexFunction怎样写。
    3 B% |4 V5 v% `  }% O/ D- r$ BmexFunction的定义为:
    % C+ v; P! g" k% B) X( X3 G+ Dvoid mexFunction(1 t* N. Z+ u' b8 P
         int nlhs,
    ) P& u, N. d. ^/ d" D: w# W0 n     mxArray *plhs[],( l" K5 g$ M) a/ ?( S% {
         int nrhs,9 L3 P2 w; x; I5 u) n9 w
         const mxArray *prhs[]) {
    1 x. A" L: B4 M8 ?& N3 w, G+ O& ?
    }1 {# V7 l+ p+ f4 C( l* _6 E
    可以看到,mexFunction是没返回值的,它不是通过返回值把结果传回Matlab的,而是通过对参数plhs的赋值。mexFunction的四个参数皆是说明Matlab调用MEX文件时的具体信息,如这样调用函数时:
    2 N- P& E- S# ?# h>> b = 1.1; c = 2.2;
    * {; w1 [- u9 c5 @3 |+ u; c* I1 ], P! {& ^>> a = add(b, c)
    5 q% U, n) `& O: x- ?7 vmexFunction四个参数的意思为:; ~! D; ?8 q% J; g8 C( a
    nlhs = 1,说明调用语句左手面(lhsleft hand side)有一个变量,即a
    5 s, X8 L: B4 [& qnrhs = 2,说明调用语句右手面(rhsright hand side)有两个自变量,即bc8 x" z+ c# B5 k/ ^6 H, y! @
    plhs是一个数组,其内容为指针,该指针指向数据类型mxArray。因为现在左手面只有一个变量,即该数组只有一个指针,plhs[0]指向的结果会赋值给a/ A2 B  l0 P8 x( M! k  _
    prhsplhs类似,因为右手面有两个自变量,即该数组有两个指针,prhs[0]指向了bprhs[1]指向了c。要注意prhsconst的指针数组,即不能改变其指向内容。
    # @+ v/ H9 h7 M/ f  x因为Matlab最基本的单元为array,无论是什么类型也好,如有double arraycell arraystruct array……所以a,b,c都是arrayb = 1.1便是一个1x1double array。而在C语言中,Matlabarray使用mxArray类型来表示。所以就不难明白为什么plhsprhs都是指向mxArray类型的指针数组。- O/ H; ]) K9 d& v0 S  R
    完整的add.c如下:
    * J9 ~. a* P8 M7 Z2 i3 i// add.c6 F0 Q+ K- D6 E# ~4 A" X. S' X
    #include "mex.h" // 使用MEX文件必须包含的头文件 // 执行具体工作的C函数6 w2 A, r' R! r6 o' T' h
    double add(double x, double y) {0 N1 d- I0 x; ?# W3 E$ s
     return x + y;
    4 y3 X' W7 ^: K0 ~, G4 {+ j} // MEX文件接口函数+ Q. B1 T' S7 T3 g. \0 s
    void mexFunction(
      O' a: e) p  ~+ ]0 u7 s: A: L int nlhs,
      m9 y1 \, Z7 Q mxArray *plhs[],
    2 d) D! p; r' n* X) }3 U: A int nrhs,& C' L: w% e7 R" R& [5 p  c
     const mxArray *prhs[]) {8 K) }; E7 m( c" J4 ]
     double *a;, v- y! T; r5 Q+ P& Z5 x
     double b, c;
      G4 T. B( E+ p8 t7 ?( p; I/ b& n plhs[0] = mxCreateDoubleMatrix(1, 1, mxREAL);& k7 j) ^" _% o  U9 Z! f: U' c2 V
     a = mxGetPr(plhs[0]);' n2 J$ Z: \( i, \
     b = *(mxGetPr(prhs[0]));% [; Y( a: U4 G3 S, X1 n( }
     c = *(mxGetPr(prhs[1]));
    + ^( V  [" X# u9 n9 Q *a = add(b, c);
    ! G- j, i3 }9 z. o6 l# I} . s; b- C/ ~" ]# @" j* O9 `
    mexFunction的内容是什么意思呢?我们知道,如果这样调用函数时:5 s4 s! n$ T, Q. m9 r2 \
    >> output = add(1.1, 2.2);
    : r, K/ b3 K4 I9 Y! @' L6 o在未涉及具体的计算时,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便是已计算好的结果了。5 K2 `6 |* y! }
    上面说的一大堆指向这指向那,什么mxArray,初学者肯定都会被弄到头晕眼花了。很抱歉,要搞清楚这些乱糟糟的关系,只有多看多练。
    0 R7 E2 a8 e5 L3 o+ o  W) ~3 z9 S实际上mexFunction是没有这么简单的,我们要对用户的输入自变量的个数和类型进行测试,以确保
    0 E4 q' L( T( w# N输入正确。如在add函数的例子中,用户输入char array便是一种错误了。
    & b7 O/ D$ }8 P" R从上面的讲述中我们总结出,MEX文件实现了一种接口,把C语言中的计算结果适当地返回给Matlab罢了。当我们已经有用C编写的大型程序时,大可不必在Matlab里重写,只写个接口,做成MEX文件就成了。另外,在Matlab程序中的部份计算瓶颈(如循环),可通过MEX文件用C语言实现,以提高计算速度。- |" D+ F7 y* C& x/ R- O7 z4 [
    , Z2 b* h4 N$ u
    *********************************************************************************************************************************************
    ! F/ l+ c$ L: [
    3 a+ g( D- D  F- smex 的目的,' \% _0 x' X3 u* H. V
    : r" A7 e1 S. |: t/ w0 c" K
    通过C/C++语言编写代码,Matlab中将其编译成mex文件主要可以做以下几方面的事情:. H9 |8 W: U" C% O: y
    ) I+ t6 ~4 T" y! q2 m8 s1 C
    1、加快程序的执行速度. Matlabfor上如老牛拉车的速度确实让人抓狂.: \3 x: j, q# Q

    - M# d6 @5 H8 j( e2、将Matlab作为C++的开发调试环境.尤其是有大量数据需要处理时,Matlab观察其中间结果十分方便.3 Y/ w/ L. N" k( Q: ]
    8 o6 V* S, |' Y0 ^" y
    3、据称可以弥补Matlab硬件设备接口的薄弱环节.
    : C: q4 W, Z1 I  T
    8 ?( d& T6 D4 h& m今天写了第一个使用MEX.
    & s1 W9 o8 h$ v- n+ M( F4 w
    ' g; T( Y7 Y0 ?. K0 w/ S7 G一个简单的对Matlab普通数值矩阵的操作.& ?; |, ?: Z# M" @. @/ {
    / B$ x1 f* V+ f8 E% n
    其中Matlab规定的与操作系统版本有关的mwSize,mwIndex, size_t32位系统上其实本质上就是int,所以; D, Y5 O8 H9 d7 f1 W
    / i3 I( ?7 U, R3 G
    一律用int代替.' \3 l1 @3 C1 H5 O. }2 ~3 E" O
    , K' s5 h7 }# o/ x& y
    #include "mex.h"" a8 ^# j% ]9 V+ q
    #include <iostream>
    6 E% F, u- ~! G0 M' h" [1 N2 u0 N! w- u6 {( Q
    void mexFunction(int nlhs,mxArray *plhs[],int nrhs,const mxArray *prhs[])& h: B% c! L, V% o/ u- N6 H2 E
    {
    ( @& U5 a+ D( o! [( b7 c" z2 [
    int i,j,k;
    9 ?; R! N. t1 z& U8 Q: G+ Zint index;5 Y0 n. }. F& k5 r" D
    double* pr=NULL;
    ; V7 }- ~7 p& _6 Odouble* pi=NULL;2 R. k3 Y) B0 U! M, H: A1 w
    int M,N;" Y  o- U8 D1 _
    int ndim;& h) ?: T" Q  C2 H$ k" N$ r
    int dims[2];+ Z7 N- Q& e5 Q5 |
    for (i=0;i<nrhs;i++); L7 Z& z' X( ~' z1 ^' v& a; c- g
    {$ }- `- `. d, M& N) Q" u8 I; A
       if ((mxIsDouble(prhs))&&(mxGetNumberOfDimensions(prhs)==2))
    : V. \" R3 I, \. g  E' K   {
    / v9 A5 T0 [, T9 P% D) p    pr=mxGetPr(prhs);
    * m' j8 l0 S) k% }) y; {9 e    pi=mxGetPi(prhs);4 \* }8 j% T2 t$ G8 F, ~& S
        M=mxGetM(prhs);
    - t0 A# k4 m/ s. E: R+ Y; ]    N=mxGetN(prhs);/ E3 d  A- E7 n# q' `: z
        ndim=mxGetNumberOfDimensions(prhs);
    + z% ^- W& _4 A
    * r+ K6 S) Y" ?( n    mexPrintf("变量%d:\n",i);
    9 q: g8 E& }6 G8 V' D' p: L    for (j=0;j<M;j++); T" m, G$ K# R& R5 E
        {
    # E9 Z' K1 S& b     dims[0]=j;
    7 U4 J8 T" }: X! P; h3 M% [9 t     for (k=0;k<N;k++)
    9 ^4 j3 {2 d. ]     {# R4 h2 F9 B8 L' }
          dims[1]=k;
    # O; L3 U# `6 z      index=mxCalcSingleSubscript(prhs,ndim,dims);
    7 \6 Q. Q; P* |2 N' X& [1 |1 O      if (pi==NULL)
    * S* z3 q9 e, W1 y      {
    % R( Z0 F  R$ u4 t+ [$ `# z( m       mexPrintf("%6.2f",pr[index]);+ _& O. M9 r& R, c8 X$ `$ H
          }
    # `" p& ^) _. L& {) p3 w; G      else{
    - h1 N5 b$ k$ m+ Q       mexPrintf("%6.2f+ %6.2fj",pr[index],pi[index]);
    ; [$ v7 s, G0 b8 I/ a, \! R      }
    - h  H- c8 S' v  H     }, [8 y! P8 G0 m5 a* Y7 R
         mexPrintf("\n");3 `  a/ u$ ^) Y4 ?3 v9 j
    1 X3 A: V/ w$ h2 \! |
        }
    0 Y! r% b# |4 K7 ~  3 B$ m9 p5 {+ G' b8 U
       }
    ! H5 Y. z2 D5 d7 C- o. A& q   else{/ U) p% s& U- K8 A0 T+ P
        mexPrintf("input NUMB %d matrix is not 2 dims&double numerical array\n",i);6 G3 {" g' P$ e7 d0 s( o
    }
    ! G+ |4 N) y& B( T
      D& E" W4 n2 q7 ?4 y3 `" K0 q7 B3 l9 _% _8 E8 V
    }" s+ {# s- I" [! ?. H, r, b
    : m/ }8 ?. V1 k) Y
    }( f# H+ y, _; Q7 G& a' g6 e
    & m+ B/ {1 n( F9 m
    Result:6 a" E% D. ^7 f/ S

    7 @2 O: b- z2 ]3 t+ ^* ]>>mex test.cpp
    8 `9 |6 W6 }" {' _5 [6 w7 C>> test(a,b,c)
    % J# M( c5 _4 l, h$ t变量0:
    # S4 u; {* o2 L4 W# Y$ B, \( s0.35 0.62 0.837 v3 ^8 l# z1 W
    0.20 0.47 0.59
    : J4 S( Y) y  K; e' b2 e/ D! E# {* X0.25 0.35 0.55
    . V/ D5 O: q5 E0 C  B变量1:8 b+ R5 x$ \* |$ z: j
    0.92 0.38 0.53 0.57( G# K' G4 q8 v3 B, n3 Y
    0.29 0.57 0.78 0.471 T; ~( Z, r7 i& @  n
    0.76 0.08 0.93 0.014 L( Q/ |; b: r9 q; Q
    0.75 0.05 0.13 0.34; L/ R2 }9 X5 R6 j
    变量2:
    3 ]. X3 l+ m3 ?/ k- @$ W3 ~$ F( ~0.16+   0.87j 0.60+   0.43j 0.45+   0.14j 0.83+   0.85j 0.11+   0.08j
    : [+ U7 N7 }  o3 m$ n9 L# [. s0.79+   0.08j 0.26+   0.91j 0.08+   0.87j 0.54+   0.62j 0.96+   0.24j
    - c* V/ F  Q3 p4 m) [; t0.31+   0.40j 0.65+   0.18j 0.23+   0.58j 1.00+   0.35j 0.00+   0.12j9 T! z+ W4 E% p  G( C
    0.53+   0.26j 0.69+   0.26j 0.91+   0.55j 0.08+   0.51j 0.77+   0.18j. R, p7 R7 h) y1 A$ g& u
    0.17+   0.80j 0.75+   0.15j 0.15+   0.14j 0.44+   0.40j 0.82+   0.24j
    6 O+ b' {; p5 }+ w$ t* W# E# J2 N& b>> help test
    - V* j$ @# d' d本程序用于调试mx______函数.  H! p& q4 k, c) E* C! d

    ; n- f; i- _' o( ~3 C- o# d( s2 \" s$ L/ ?
    本文来自: 高校自动化网(Www.zdh1909.com) 详细出处参考(转载请保留本链接)http://www.zdh1909.com/html/matlab/14744.html
    , T7 k  t/ {2 N" E9 B# i' L* a% {1 h% d& T
    下面是其附件,内容一样,方便下载 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-8-24 04:43 , Processed in 0.584206 second(s), 111 queries .

    回顶部