QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4577|回复: 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
    & h" s: }6 q1 f; v
    Matlab调用c程序
    6 ?6 }' Y- u. V5 e文章来源:不详 作者:佚名 + `% x+ A2 y4 l3 R6 C& d3 G
    5 t8 w, g1 ~9 W9 g) \3 w3 W2 @
    --------------------------------------------------------------------------------: R* L  _1 O! q5 B  Z

    . Y9 f$ b$ f1 [+ S该文章讲述了Matlab调用c程序./ S) I+ ?1 O* r
    ! K  K7 M% q1 w* D
    方法:# i5 }8 I- h' X4 _, ~9 b
    第一步:要先在matlab中安装c程序编译器,步骤如下:. K. g5 x, w0 h( z! o! L& t* J1 J( r
    键入命令:mex -setup
    : L7 x1 w; J. V& p3 z" A8 i8 C选择c/c++编译器;
    5 q: s, p5 f4 r( q- I! C) ]5 t选择c/c++编译器版本;' _1 J$ W8 ~6 m5 B
    确认。
    6 h! r9 E, z1 `! X第二步:键入:mex *.c. r& U: ~1 R9 h: B1 G
    " h4 W1 s$ {/ I% C( |
    *********************************************************************************************************************************************
    0 z3 {' o& Y4 x% V/ X* t* o2 H" \' G: C# X: a
    实例介绍:【转】) s$ b. Y" C6 f- {: ^

    0 T1 T5 L; n+ P! ~如果我有一个用C语言写的函数,实现了一个功能,如一个简单的函数:
    3 O  S  B: G6 n3 H2 Udouble add(double x, double y) {2 H4 n" l7 D2 J; X9 P/ k. }1 ]- T1 I
     return x + y;% t* B1 S- H6 P* _
    }
    1 V+ Z/ I( y" E; y! U现在我想要在Matlab中使用它,比如输入:4 K; O: q, u: b2 Y) p
    >> a = add(1.1, 2.2)
    ) s6 f# v4 t/ `  E4 N3.3000
    . |% Z& U8 {7 W; B' A要得出以上的结果,那应该怎样做呢?% G8 q& I4 r% G4 u  ?, V
    解决方法之一是要通过使用MEX文件,MEX文件使得调用C函数和调用Matlab的内置函数一样方便。MEX文件是由原C代码加上MEX文件专用的接口函数后编译而成的。( K- P9 r3 x/ E% J8 W/ d
    可以这样理解,MEX文件实现了一种接口,它把在Matlab中调用函数时输入的自变量通过特定的接口调入了C函数,得出的结果再通过该接口调回Matlab。该特定接口的操作,包含在mexFunction这个函数中,由使用者具体设定。
      b# B" ^) O+ `所以现在我们要写一个包含addmexFunctionC文件,Matlab调用函数,把函数中的自变量(如上例中的1.12.2)传给mexFunction的一个参数,mexFunction把该值传给add,把得出的结果传回给mexFunction的另一个参数,Matlab通过该参数来给出在Matlab语句中调用函数时的输出值(如上例中的a)。2 D0 K' t' v. F/ w
    比如该C文件已写好,名为add.c。那么在Matlab中,输入:' r( o8 q& }) B3 @
    >> mex add.c
    % x7 n( C9 V& P, R就能把add.c编译为MEX文件(编译器的设置使用指令mex -setup),在Windows中,MEX文件类型为mexw32,即现在我们得出add.mexw32文件。现在,我们就可以像调用M函数那样调用MEX文件,如上面说到的例子。所以,通过MEX文件,使用C函数就和使用M函数是一样的了。
    6 U! A) J$ [# m* c我们现在来说mexFunction怎样写。
    3 |' R8 H7 ~8 D$ E! {- B. CmexFunction的定义为:" h6 {7 l0 u' }, x+ B
    void mexFunction(5 D7 D: y# s$ z
         int nlhs,
    ' ^% `- [8 m+ Y; I- C2 ~     mxArray *plhs[],
    ) y; O  ~  ]  t& r     int nrhs,& y, T& Q0 A8 {. [8 H
         const mxArray *prhs[]) {
    % w  ]3 w; Z) y$ O2 J* N3 J
    ) Q- w# l9 G4 X( d2 y: B5 `}# U* P' H0 C; F+ C
    可以看到,mexFunction是没返回值的,它不是通过返回值把结果传回Matlab的,而是通过对参数plhs的赋值。mexFunction的四个参数皆是说明Matlab调用MEX文件时的具体信息,如这样调用函数时:
    0 I8 W% }: E7 A>> b = 1.1; c = 2.2;+ A4 _1 q5 }+ V& Z* a* d
    >> a = add(b, c)- t' @* W5 f" k1 M+ v# m0 e
    mexFunction四个参数的意思为:: v3 K( j! g0 ?+ {- M! y% \
    nlhs = 1,说明调用语句左手面(lhsleft hand side)有一个变量,即a
    5 f1 a/ h3 I3 f9 Mnrhs = 2,说明调用语句右手面(rhsright hand side)有两个自变量,即bc! S/ e) g; h6 f% c
    plhs是一个数组,其内容为指针,该指针指向数据类型mxArray。因为现在左手面只有一个变量,即该数组只有一个指针,plhs[0]指向的结果会赋值给a
    . T" e! ?* {1 K4 rprhsplhs类似,因为右手面有两个自变量,即该数组有两个指针,prhs[0]指向了bprhs[1]指向了c。要注意prhsconst的指针数组,即不能改变其指向内容。
    ! |. j$ a8 |7 t2 s5 W& p0 j因为Matlab最基本的单元为array,无论是什么类型也好,如有double arraycell arraystruct array……所以a,b,c都是arrayb = 1.1便是一个1x1double array。而在C语言中,Matlabarray使用mxArray类型来表示。所以就不难明白为什么plhsprhs都是指向mxArray类型的指针数组。5 c. w3 b+ `$ m1 Y% |$ E/ H
    完整的add.c如下:
    % i  T: Z9 n" v// add.c
    + b' f  D0 u2 f' g. g& T# U! T#include "mex.h" // 使用MEX文件必须包含的头文件 // 执行具体工作的C函数
    1 `5 ~& k2 Y. w7 I" R# bdouble add(double x, double y) {) H$ h6 s( m% O( y; j. Q
     return x + y;+ c9 K3 o1 u: C, O3 \* p0 x" m: B
    } // MEX文件接口函数
    , q; t. p3 Y, ^; [  Mvoid mexFunction(4 ?9 j- D0 V$ F4 e
     int nlhs,! c! Q; H+ V' Y; d
     mxArray *plhs[],6 S7 O6 \6 f) v1 Z$ R$ e. P& Q- t
     int nrhs,) t; x' |$ w/ R( q/ [$ X- J! E
     const mxArray *prhs[]) {/ F  ]1 t+ \5 d! |% B: N. O
     double *a;5 b% F- v' m5 F* {9 w/ G% g8 l: H
     double b, c;
    / D; H& {, G. t- }% p plhs[0] = mxCreateDoubleMatrix(1, 1, mxREAL);% A6 M% O8 ?: W! w" N# ]2 v
     a = mxGetPr(plhs[0]);
    0 K5 J" n% K+ j' |3 y1 `) Z; F' s# m b = *(mxGetPr(prhs[0]));
    ) _9 g3 g6 g" I9 l7 {$ K" S c = *(mxGetPr(prhs[1]));) y8 |1 Y- X) O  |! t
     *a = add(b, c);7 q; j( N9 t) ~4 J
    } $ R) s5 }8 O8 \( r
    mexFunction的内容是什么意思呢?我们知道,如果这样调用函数时:# v! b8 @* I  Y7 R7 ?3 R
    >> output = add(1.1, 2.2);
      I6 P3 _; w& I2 d) }在未涉及具体的计算时,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便是已计算好的结果了。9 F, V/ v7 i6 `, N
    上面说的一大堆指向这指向那,什么mxArray,初学者肯定都会被弄到头晕眼花了。很抱歉,要搞清楚这些乱糟糟的关系,只有多看多练。
    * O2 \4 Y# A+ M) _实际上mexFunction是没有这么简单的,我们要对用户的输入自变量的个数和类型进行测试,以确保
    6 n" ^3 H' J5 c输入正确。如在add函数的例子中,用户输入char array便是一种错误了。0 h' a/ x& T5 m8 X$ p9 K7 z
    从上面的讲述中我们总结出,MEX文件实现了一种接口,把C语言中的计算结果适当地返回给Matlab罢了。当我们已经有用C编写的大型程序时,大可不必在Matlab里重写,只写个接口,做成MEX文件就成了。另外,在Matlab程序中的部份计算瓶颈(如循环),可通过MEX文件用C语言实现,以提高计算速度。6 @6 U, L% F. z* I" b

    # A  f+ z& w) S*********************************************************************************************************************************************
    & t# `9 u0 [- G: |
    " g0 p+ v8 g- l* f- p8 M, l" W, n# ?mex 的目的,, U9 D( ?* ^( Z" U
    2 x! d4 p6 p( `0 U; c. w
    通过C/C++语言编写代码,Matlab中将其编译成mex文件主要可以做以下几方面的事情:' W& f: `2 A8 H- e0 h* H+ ]
    0 j* p3 z/ |6 K4 }* n
    1、加快程序的执行速度. Matlabfor上如老牛拉车的速度确实让人抓狂.1 F7 t% r' p2 I8 E. x# D

    * }1 }6 i3 D; D* H# M' U- w2、将Matlab作为C++的开发调试环境.尤其是有大量数据需要处理时,Matlab观察其中间结果十分方便.! O+ w6 Z( v7 t. W0 c. X3 N  b

    4 M+ X# q& C* f3、据称可以弥补Matlab硬件设备接口的薄弱环节.
    ) ?: W8 Z1 c% }8 p& I% O. \
    1 K0 x4 [: r! [8 B+ X' s# g$ M今天写了第一个使用MEX.; h2 v" Q- v# y: X; P5 q

    ) L; l$ [4 V" w4 m一个简单的对Matlab普通数值矩阵的操作.! W4 |! |5 R  |, P5 E

    1 Z* x6 D2 O9 U" K5 [% F其中Matlab规定的与操作系统版本有关的mwSize,mwIndex, size_t32位系统上其实本质上就是int,所以9 c+ v3 V6 X5 I0 v$ I/ v! m" y
    / y* L2 S0 w6 b# o% T4 Z+ ^* ]4 a' t
    一律用int代替.
    ; B: u  }) P; e" F" l8 ~6 N' _7 G) U* m
    #include "mex.h"
    2 m# i' t. D. g+ l) R#include <iostream>' {8 W( [1 j2 y$ u% Z

    + f: V- u$ S0 s5 v" c# ?% pvoid mexFunction(int nlhs,mxArray *plhs[],int nrhs,const mxArray *prhs[])
    1 }- i  R( M, S1 W- ]" `$ u{4 t: F- \4 ~, W# F+ d9 H0 X. l5 Q8 x! y
    4 |2 q  v. _: x
    int i,j,k;* ^2 \1 H0 }( z
    int index;6 M6 a/ d: k3 E" p" `! ]- l
    double* pr=NULL;
    5 T/ Y! N+ V3 V; E- n4 k$ K8 j* ldouble* pi=NULL;; [. P0 J& ]' c. x
    int M,N;
    9 x1 ~4 d' k' \/ Rint ndim;
    ! ]- w( F7 H; a4 m5 r! xint dims[2];
    : G) I1 \! p% q: t2 jfor (i=0;i<nrhs;i++)4 ^& {' A( m6 t* i2 P' R3 b
    {- |" V; s" L" u; C6 s
       if ((mxIsDouble(prhs))&&(mxGetNumberOfDimensions(prhs)==2))
    & |1 c4 P6 F2 w   {0 }6 B. q, t; o
        pr=mxGetPr(prhs);& s0 ?! n7 N  M$ l8 t. v) t
        pi=mxGetPi(prhs);
    ) J; W3 z: K) k0 b    M=mxGetM(prhs);
    $ ~# j# T$ E. C. ~. ?. j    N=mxGetN(prhs);* g( c$ j6 e7 T
        ndim=mxGetNumberOfDimensions(prhs);
    4 i3 F  R/ B# i( f) Z/ ?# ]
    1 k9 h! `6 A  }    mexPrintf("变量%d:\n",i);
    7 ?. N0 b+ i9 q# Y% }! H    for (j=0;j<M;j++)
    % v) O) L+ m3 s* E    {
    ! a; N, }! ?( \2 B/ J9 p" u: S     dims[0]=j;
    1 b. a% q2 P0 \9 B- b; [% m     for (k=0;k<N;k++)
    / S" I2 w4 X1 }# o0 v" ?2 y$ M1 r     {
    6 O) u# S' ^- s/ x& v# V      dims[1]=k;
    $ [" M; o' v% K" [" h      index=mxCalcSingleSubscript(prhs,ndim,dims);! P1 J. _; ]3 X
          if (pi==NULL)
    & ?! \$ w! \, k      {# z/ p( n0 m* ]9 c1 t  l
           mexPrintf("%6.2f",pr[index]);& w" W* m9 i% Z$ r- p3 j3 U
          }- B% v% `% J; _* F$ i
          else{- V! \% y( b  L' E0 n6 t
           mexPrintf("%6.2f+ %6.2fj",pr[index],pi[index]);
    7 o3 T- i7 p" |" r: X      }5 C4 B3 q" A- S, g
         }
    " e9 k8 G5 G5 H# B     mexPrintf("\n");
    & G  N! C( i! z! a' y" m
    ( g- R3 R9 l- ]9 @$ G* F( D    }: m, q3 |! Y2 d+ C" N& n$ c! _8 ?( n
      3 U, |! Q: ?% M
       }
    . s* e( ~# S0 x1 I: j9 t" L4 y3 W% c4 O   else{
    & z" @" U" W7 [3 K% Y9 R% q& ^    mexPrintf("input NUMB %d matrix is not 2 dims&double numerical array\n",i);% g4 X* @/ \1 J9 {# e7 m8 s7 r! x
    }( Z6 m/ A2 G5 |% c7 P/ p
    4 O  U3 O1 q: g( S! t0 V2 I
    # v4 `* p6 F5 `' m! p5 W8 ^5 R' ]
    }4 C) }: J2 ~1 i" b. ^# o

    % z9 j1 ~2 X/ x2 O& w}
    ; ]8 W3 T4 @/ J) |8 Z# x) Q, b; r( ?9 t/ e* a
    Result:
    # l1 o3 @! p2 c, P; X  p0 k; \; P2 f
    >>mex test.cpp# s* s" F  Z& \% z4 Y! ~
    >> test(a,b,c)
    3 S, `  z9 T8 w4 W: W( d4 n- W变量0:# F- ?  ~- \9 h5 \; p% t2 l  k0 `
    0.35 0.62 0.833 b* C  G. _1 a, a3 F/ z
    0.20 0.47 0.59
    " ^4 i% A; {9 ]% z& k. \0.25 0.35 0.550 ]. R* O; E0 `  Q4 V
    变量1:3 N! B4 E: d# R3 k3 s  w" ^: L) M
    0.92 0.38 0.53 0.57# ~5 m5 z' t7 [9 g1 g
    0.29 0.57 0.78 0.47! Y8 D* l4 b: d# _
    0.76 0.08 0.93 0.013 l: U5 l( Q0 X" M4 F# L% y, p
    0.75 0.05 0.13 0.34
    * S) v- D8 c2 D) h4 y变量2:: c. @' K2 F6 w9 l# R
    0.16+   0.87j 0.60+   0.43j 0.45+   0.14j 0.83+   0.85j 0.11+   0.08j1 v- Y0 ~& K7 d8 W( E
    0.79+   0.08j 0.26+   0.91j 0.08+   0.87j 0.54+   0.62j 0.96+   0.24j7 h% F1 j6 K: V8 Q) v9 O* i
    0.31+   0.40j 0.65+   0.18j 0.23+   0.58j 1.00+   0.35j 0.00+   0.12j
    3 e" K& J& ^+ F9 b/ u0.53+   0.26j 0.69+   0.26j 0.91+   0.55j 0.08+   0.51j 0.77+   0.18j. h$ U- v3 L4 y# W1 W
    0.17+   0.80j 0.75+   0.15j 0.15+   0.14j 0.44+   0.40j 0.82+   0.24j6 u4 a. g" Z4 ?* W, v7 `" |0 U8 g
    >> help test
    ' k5 p( _: O9 q0 m( M: {3 G0 v本程序用于调试mx______函数., T2 r; K, B; X$ H; X9 i$ g
    1 \! L8 M4 U$ u& S8 _1 \

    , Y) o2 g! f7 b2 n4 O本文来自: 高校自动化网(Www.zdh1909.com) 详细出处参考(转载请保留本链接)http://www.zdh1909.com/html/matlab/14744.html" u2 U7 D; I& A/ {3 A

    $ b1 R5 C+ t1 I; G/ 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 01:52 , Processed in 0.578832 second(s), 112 queries .

    回顶部