QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4091|回复: 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

    0 D3 k# e  [8 g% m9 c6 zMatlab调用c程序
    ! I0 U/ w1 Q& L+ @# a3 M( }文章来源:不详 作者:佚名 , |8 X  |  j$ l  A

    $ p( L) {2 V1 P- m: m--------------------------------------------------------------------------------. }+ z" T3 `! G+ }6 I: _

    , Y0 w4 @- {: |. C7 b. M4 a' L. Z" V该文章讲述了Matlab调用c程序.
    . C" {( t5 |4 w' w. q8 X
    / b7 l2 A' X8 ~, e( T方法:( h0 Z, w! O1 p( h
    第一步:要先在matlab中安装c程序编译器,步骤如下:& n2 f# _, A1 \0 Z, V' V7 G
    键入命令:mex -setup
    7 B2 C4 h# w; B- [选择c/c++编译器;) D5 x- g  t6 |. r  P2 I4 u3 {
    选择c/c++编译器版本;
    0 ]6 h% A8 M* b( i  K确认。, [) t$ E9 R; X; ]* [
    第二步:键入:mex *.c
    ' e+ [; V5 g7 \$ b. \# W6 s/ J
    : m$ V3 ~  [! k+ o*********************************************************************************************************************************************
    6 j$ m2 [; l3 ?1 x+ l* i+ c  e2 g( A" Q: R
    实例介绍:【转】5 p9 w- j  t! v, E! R' D( A

      H; Y# J# g  c) D$ e如果我有一个用C语言写的函数,实现了一个功能,如一个简单的函数:
    ! {: c" s0 W3 n& Y7 O( S3 Mdouble add(double x, double y) {4 @% o0 k* C: k, g
     return x + y;4 C7 L+ V8 I9 I5 q7 l' m0 A  g5 q
    }
    ! ]& r: d' ^9 z- k  ]现在我想要在Matlab中使用它,比如输入:
    ' m% K$ T( ^' E$ D8 X>> a = add(1.1, 2.2)7 y3 C$ C: Y( s4 @7 D  M
    3.3000( ^8 \7 N5 c* ?' C$ b) W9 G; |1 m
    要得出以上的结果,那应该怎样做呢?
    1 e& l5 z4 F  p  q6 A# S) h2 m  j; G2 `解决方法之一是要通过使用MEX文件,MEX文件使得调用C函数和调用Matlab的内置函数一样方便。MEX文件是由原C代码加上MEX文件专用的接口函数后编译而成的。+ u3 z+ L# v* S( F3 l
    可以这样理解,MEX文件实现了一种接口,它把在Matlab中调用函数时输入的自变量通过特定的接口调入了C函数,得出的结果再通过该接口调回Matlab。该特定接口的操作,包含在mexFunction这个函数中,由使用者具体设定。+ P8 I2 X# M# D* u2 E  _1 A! c5 D5 ]1 t
    所以现在我们要写一个包含addmexFunctionC文件,Matlab调用函数,把函数中的自变量(如上例中的1.12.2)传给mexFunction的一个参数,mexFunction把该值传给add,把得出的结果传回给mexFunction的另一个参数,Matlab通过该参数来给出在Matlab语句中调用函数时的输出值(如上例中的a)。
    5 {; v" x3 y5 Y8 e比如该C文件已写好,名为add.c。那么在Matlab中,输入:
    7 i0 D  I# p! ^3 d6 x9 m>> mex add.c5 r  _, |7 F7 A' T6 v
    就能把add.c编译为MEX文件(编译器的设置使用指令mex -setup),在Windows中,MEX文件类型为mexw32,即现在我们得出add.mexw32文件。现在,我们就可以像调用M函数那样调用MEX文件,如上面说到的例子。所以,通过MEX文件,使用C函数就和使用M函数是一样的了。. U, g3 H' i( X" a. {1 T$ \
    我们现在来说mexFunction怎样写。1 a* s0 b4 ?9 \. ?; J
    mexFunction的定义为:' D8 V5 ]6 ^. e
    void mexFunction(
    . F) r# d* L7 N+ \9 t1 B: a: W! J     int nlhs,
    6 N9 U1 ^  W" t* ~     mxArray *plhs[],
    # |/ k  T; r& d: R" J7 Y     int nrhs,; b5 v- a& _% ?- L4 w+ ^1 T
         const mxArray *prhs[]) {
    , y6 Q, |$ J$ ?4 J
    ) X" d( D1 M3 x' d. O1 R$ c}
    6 P5 w! Y4 o5 Z* o可以看到,mexFunction是没返回值的,它不是通过返回值把结果传回Matlab的,而是通过对参数plhs的赋值。mexFunction的四个参数皆是说明Matlab调用MEX文件时的具体信息,如这样调用函数时:
    : r4 d/ f, s  F* L1 R7 A* C3 A>> b = 1.1; c = 2.2;
    1 `; c8 z( }7 p8 s- a+ X>> a = add(b, c)5 w4 r9 f- J5 ]* A5 r! W
    mexFunction四个参数的意思为:
    2 V& p4 s" U8 Y  k3 ^nlhs = 1,说明调用语句左手面(lhsleft hand side)有一个变量,即a
    , E; B3 L5 g3 W1 S; [/ \nrhs = 2,说明调用语句右手面(rhsright hand side)有两个自变量,即bc# |/ F1 B4 Z+ \/ l4 i9 x% @
    plhs是一个数组,其内容为指针,该指针指向数据类型mxArray。因为现在左手面只有一个变量,即该数组只有一个指针,plhs[0]指向的结果会赋值给a$ G4 C4 R$ j# `+ d4 v
    prhsplhs类似,因为右手面有两个自变量,即该数组有两个指针,prhs[0]指向了bprhs[1]指向了c。要注意prhsconst的指针数组,即不能改变其指向内容。
    " T1 n( t8 |; c: S因为Matlab最基本的单元为array,无论是什么类型也好,如有double arraycell arraystruct array……所以a,b,c都是arrayb = 1.1便是一个1x1double array。而在C语言中,Matlabarray使用mxArray类型来表示。所以就不难明白为什么plhsprhs都是指向mxArray类型的指针数组。$ S2 l; R- p' w: @; v% S
    完整的add.c如下:
    " P2 G/ {0 U+ {) U# r" w1 N9 F// add.c  Z4 q4 V) Q0 K* X, J3 K
    #include "mex.h" // 使用MEX文件必须包含的头文件 // 执行具体工作的C函数
    " g" o2 g3 y! R; y( jdouble add(double x, double y) {
    * I, U- w: R8 g return x + y;
    2 v$ Y% p3 E, E+ s} // MEX文件接口函数, q  C2 E* g9 g6 u  h6 q' z# V6 t
    void mexFunction(0 `, i5 j/ \/ K
     int nlhs,8 F, l! I" ~& f5 w
     mxArray *plhs[],. B) [. \- H+ Y* z( r0 |6 w
     int nrhs,( F  z/ Q2 p; ~
     const mxArray *prhs[]) {
    9 Z+ G; O6 V6 |6 y. E double *a;
    8 |$ ~: ^+ ^' w0 ]1 s double b, c;( k& ]2 z4 x1 S$ m; y7 V: j
     plhs[0] = mxCreateDoubleMatrix(1, 1, mxREAL);
    6 G! l' Y9 z3 ]2 [: S a = mxGetPr(plhs[0]);
    . @, u. E  ?+ [: L b = *(mxGetPr(prhs[0]));
    # J, @9 S- A/ U! D- b7 e$ S8 } c = *(mxGetPr(prhs[1]));* N( Z, a- h* j- _3 r3 v4 J2 U0 V2 y: n
     *a = add(b, c);
    ! g) N. y) m: @4 ~} - F* f6 b+ \4 }
    mexFunction的内容是什么意思呢?我们知道,如果这样调用函数时:3 u; X9 G. I9 N/ ~: z8 K0 d
    >> output = add(1.1, 2.2);* u; w; I8 r0 z8 f8 e
    在未涉及具体的计算时,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便是已计算好的结果了。
    ) e' c" v: u& O5 H1 v上面说的一大堆指向这指向那,什么mxArray,初学者肯定都会被弄到头晕眼花了。很抱歉,要搞清楚这些乱糟糟的关系,只有多看多练。
    7 `) H3 z( W5 [9 u实际上mexFunction是没有这么简单的,我们要对用户的输入自变量的个数和类型进行测试,以确保- B8 l$ N2 v, `) f3 D
    输入正确。如在add函数的例子中,用户输入char array便是一种错误了。, R' g/ @- i/ N5 k. n
    从上面的讲述中我们总结出,MEX文件实现了一种接口,把C语言中的计算结果适当地返回给Matlab罢了。当我们已经有用C编写的大型程序时,大可不必在Matlab里重写,只写个接口,做成MEX文件就成了。另外,在Matlab程序中的部份计算瓶颈(如循环),可通过MEX文件用C语言实现,以提高计算速度。
    ( y1 v% c* N/ t
    0 A3 Y6 N4 s& j% H6 d*********************************************************************************************************************************************
    / l# w: e( m6 n& D4 D) v6 A% u7 ]. w1 a0 i( W# S# N0 o
    mex 的目的,
    5 u. k8 G6 r6 ]+ m  H' u1 U- k5 {$ o' L0 M& r4 ?' L" m
    通过C/C++语言编写代码,Matlab中将其编译成mex文件主要可以做以下几方面的事情:
    " G- I8 J% x' e& q
    , a0 G' O9 k1 R: Y3 P2 d5 }1、加快程序的执行速度. Matlabfor上如老牛拉车的速度确实让人抓狂.3 U$ T) J, D2 Z' N% }& ]+ S( @$ L

    , L4 K/ U" X$ f& o( C7 |2、将Matlab作为C++的开发调试环境.尤其是有大量数据需要处理时,Matlab观察其中间结果十分方便.& z  r0 x  e6 h$ Z1 V5 H

    - e! C0 g! D7 i3 K: U# A& c" s! L3、据称可以弥补Matlab硬件设备接口的薄弱环节.
    & A* h( p1 u7 b- S! h  }) c
    / V8 D% d& @- `. W  u& r- i今天写了第一个使用MEX.4 P; T1 P  e' [! P2 Z0 w7 e

    9 ^* M; J: b3 y9 r9 V( v一个简单的对Matlab普通数值矩阵的操作.( q; Z, Q* b2 }3 }0 T2 J9 V

    ( y7 i- l5 i/ P! E7 ?+ |其中Matlab规定的与操作系统版本有关的mwSize,mwIndex, size_t32位系统上其实本质上就是int,所以# R' {1 ~; K) p
    $ b. _- M7 F9 E$ y$ y
    一律用int代替.
    * |0 b: g% R3 P/ G; i) [
    . r9 w8 l9 L* f: p0 D#include "mex.h"+ S* y( T; o1 g' }- I
    #include <iostream>  Q4 @6 q& [- |7 B1 o
    + i* L  A4 z" {7 G
    void mexFunction(int nlhs,mxArray *plhs[],int nrhs,const mxArray *prhs[])
    8 l+ |1 u; a! c+ B' Y{
    % {5 U( R  i( V+ P; d# ?- [/ j# E! Z$ C2 m% K
    int i,j,k;
    4 j5 q6 k* m1 {( y! D5 x* X; a9 _int index;
    / c. Z& h7 I+ R7 J0 qdouble* pr=NULL;
    : U1 y' O! W, E% `4 cdouble* pi=NULL;# H$ `  N4 W& r
    int M,N;- F( B2 {. |) `8 @9 e2 I: F
    int ndim;
    ' b6 u+ v5 B. o1 ~+ v+ G, Rint dims[2];9 }4 U- o- b* R/ ~6 ~% N- M
    for (i=0;i<nrhs;i++)3 c: |# Z4 r) l8 Q$ [6 D8 b! g' H+ U
    {# ?0 N$ ^, _* ^6 g1 V
       if ((mxIsDouble(prhs))&&(mxGetNumberOfDimensions(prhs)==2))2 n, l4 G, v8 }. L
       {0 Y# s! i8 _9 @& U  a
        pr=mxGetPr(prhs);4 J0 T( O; `* ?
        pi=mxGetPi(prhs);5 d. ~* ]. [! c- y  ^  K8 i
        M=mxGetM(prhs);( _: y: W/ @) ~! P" j. h6 n; `
        N=mxGetN(prhs);$ d. v/ N! K7 h+ {2 ^$ p' @3 [
        ndim=mxGetNumberOfDimensions(prhs);' }$ y) d' f- k9 V6 B
    # ]3 m0 t0 X7 B+ q0 I* x
        mexPrintf("变量%d:\n",i);
    / o+ f. R0 ?) y5 ], _* t    for (j=0;j<M;j++)
    : p, K  _( M0 [) b8 B    {
    4 W: Q. P& ^+ p% a# I! z# U     dims[0]=j;
    # p* O8 s$ V: R, T7 s     for (k=0;k<N;k++)2 @# j4 H, x& m+ D0 G. j: l9 b
         {
    % ]" @; w: B. I7 C1 W      dims[1]=k;8 Q- ^/ d. ^; {; N
          index=mxCalcSingleSubscript(prhs,ndim,dims);2 `6 b1 n& L+ h0 W9 r5 u: u3 T
          if (pi==NULL)
    # @* r7 H0 g7 k& H      {% v4 k$ U( k6 F. q$ ~- Z1 D
           mexPrintf("%6.2f",pr[index]);
    ' M5 \) H8 Y; L, F2 ~+ @* K' G      }
    1 j1 J3 M+ m8 y      else{  n! I3 B) |4 Y- z0 ?5 g
           mexPrintf("%6.2f+ %6.2fj",pr[index],pi[index]);
    8 m3 M' F  G' r" S3 X      }
    ) H" \( c5 U* S5 @2 y7 X# z2 _1 C     }
    $ s, Z- B3 t! k5 s' c' H" E     mexPrintf("\n");! g" E/ U: q5 I) a9 m1 R

    7 U9 g8 r' u4 u, ]8 D8 R    }
    2 f* D4 q* Q) B5 G  % |% k% U6 V( M! r# T" U: j
       }
    ) k9 d1 J) y8 @1 i   else{
    : i% }9 n' y0 Z" N& Q    mexPrintf("input NUMB %d matrix is not 2 dims&double numerical array\n",i);
    - j4 Q6 z$ \# w+ F: M  i}. Q/ r6 L1 I8 a) n: c
    ! k% n7 M( E6 e+ a2 J) u

    6 Q* y6 P9 f* D7 h+ E2 \, K}
    $ f! ~$ o2 E! e: g7 c; ?0 {/ y- g5 f; u! j* C
    }
    8 j# ]" Z1 R, \3 a3 q$ w
    0 q: a. j1 F: i: DResult:
    / `4 V0 d; ~- u' N' A+ q
    6 H9 U' c2 n$ o" n3 @' `>>mex test.cpp! J8 e& C) v, }( c4 g/ m
    >> test(a,b,c)" o! Q0 N' }8 z
    变量0:
      d8 r" T" ?5 r' J& _" c0.35 0.62 0.83
    ( K# H0 B8 {6 H- E! L- Z0.20 0.47 0.59: \( r7 `  K* p7 Y9 c
    0.25 0.35 0.55
    . F5 }; x1 J; O" @5 V& R变量1:
    ; |: h: @4 u) [0.92 0.38 0.53 0.57
      F2 E) t& q, ]1 C8 M' ]0.29 0.57 0.78 0.47
    ) W  \" J8 @  ]0.76 0.08 0.93 0.01$ g) G! V! G- H9 S- V
    0.75 0.05 0.13 0.34' ^5 L( ?: H0 x
    变量2:
    7 b& d# U# ~4 _- o  R$ a0.16+   0.87j 0.60+   0.43j 0.45+   0.14j 0.83+   0.85j 0.11+   0.08j7 n9 `7 _  D  m4 I
    0.79+   0.08j 0.26+   0.91j 0.08+   0.87j 0.54+   0.62j 0.96+   0.24j
    ' Y+ P( X& [. U* r* s. a0.31+   0.40j 0.65+   0.18j 0.23+   0.58j 1.00+   0.35j 0.00+   0.12j
    8 j1 r3 X9 C0 Y7 y7 `0.53+   0.26j 0.69+   0.26j 0.91+   0.55j 0.08+   0.51j 0.77+   0.18j% ?9 ?3 ?: j0 D# L. a4 f2 y
    0.17+   0.80j 0.75+   0.15j 0.15+   0.14j 0.44+   0.40j 0.82+   0.24j/ r2 h+ D$ X( e2 v- s
    >> help test
    0 q1 ]; V" p" S3 y& u4 H: k本程序用于调试mx______函数.2 T( L0 n$ M+ p
    . j3 W* y: X3 m! W  n. C

    2 F  h; d  f4 g4 V! z( [8 Q% j本文来自: 高校自动化网(Www.zdh1909.com) 详细出处参考(转载请保留本链接)http://www.zdh1909.com/html/matlab/14744.html- l7 W3 |( M% |

    ; \; |. R9 l9 q! q$ }下面是其附件,内容一样,方便下载 Matlab调用c程序.doc (41.5 KB, 下载次数: 10)
    zan
    已有 1 人评分体力 收起 理由
    天海星云 + 5 很不错的,鼓励共享。

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

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

    32

    主题

    50

    听众

    2951

    积分

  • 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, 2025-8-2 15:17 , Processed in 0.709128 second(s), 111 queries .

    回顶部