QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4104|回复: 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
    " G% {8 K  V, Y8 h7 S6 h
    Matlab调用c程序
    ; i0 F6 Q$ l* r* A' {& c. t文章来源:不详 作者:佚名 0 W& _  Q$ w2 i( d' L1 x& ~

    ' g1 v5 ?) d: ^2 @& I7 M8 j--------------------------------------------------------------------------------8 d1 f8 `0 V5 V

    2 `7 ?( t( X, S8 s2 y该文章讲述了Matlab调用c程序.
    9 N9 x: ^  ^$ n- [1 ^3 ` ' f' ~2 M1 I# V$ {
    方法:
    2 Z7 G$ t# `/ K  F6 x% W第一步:要先在matlab中安装c程序编译器,步骤如下:
    0 x7 d6 O1 {  [3 g+ S( H0 P8 V3 j键入命令:mex -setup2 G3 @: t+ a8 X3 ^) Y
    选择c/c++编译器;2 ?/ z0 p! D, p& \4 }% s
    选择c/c++编译器版本;" \. }5 y& D  ], T8 V6 @9 s
    确认。% Y9 ~9 i. t" i
    第二步:键入:mex *.c
    # S8 y0 S" e# f1 N- V; S" J; J4 R- H( b3 u" P  _9 D6 X
    *********************************************************************************************************************************************
    : e7 g  p* D/ w7 n7 ~- b7 n, @1 t3 P  v7 n3 |& ?$ ^0 z
    实例介绍:【转】' s0 E! Q+ E' l% P) S! c/ I
    + r+ X# i3 V; U' e" d& t9 G' b& x
    如果我有一个用C语言写的函数,实现了一个功能,如一个简单的函数:3 L) w$ O& T9 Y: X$ N+ L
    double add(double x, double y) {
    0 j9 j4 x1 ~, D1 e6 U, ` return x + y;
    7 J2 v& T4 x+ |; g# @}
    ( ~' B3 o, g' L$ N现在我想要在Matlab中使用它,比如输入:% h: y/ Y1 M, }* d- p  S# z, k4 E2 u
    >> a = add(1.1, 2.2)
    8 f( `; S: R% O8 r7 Z  ^9 t3.3000
    9 ]8 W) M8 _' p2 a4 e1 f- l要得出以上的结果,那应该怎样做呢?/ e! w. J+ O- l8 k2 q& z; B4 E
    解决方法之一是要通过使用MEX文件,MEX文件使得调用C函数和调用Matlab的内置函数一样方便。MEX文件是由原C代码加上MEX文件专用的接口函数后编译而成的。- Q; @7 @6 o# ]# I+ L: l. A
    可以这样理解,MEX文件实现了一种接口,它把在Matlab中调用函数时输入的自变量通过特定的接口调入了C函数,得出的结果再通过该接口调回Matlab。该特定接口的操作,包含在mexFunction这个函数中,由使用者具体设定。
    $ Z* P7 @8 B4 X9 r9 q所以现在我们要写一个包含addmexFunctionC文件,Matlab调用函数,把函数中的自变量(如上例中的1.12.2)传给mexFunction的一个参数,mexFunction把该值传给add,把得出的结果传回给mexFunction的另一个参数,Matlab通过该参数来给出在Matlab语句中调用函数时的输出值(如上例中的a)。
    ) ]4 P% j/ y- X$ T2 [9 o4 [6 \- x比如该C文件已写好,名为add.c。那么在Matlab中,输入:- o  n/ b1 i8 E$ e
    >> mex add.c; ]+ A5 f. _+ @+ ?- k; u4 E* x
    就能把add.c编译为MEX文件(编译器的设置使用指令mex -setup),在Windows中,MEX文件类型为mexw32,即现在我们得出add.mexw32文件。现在,我们就可以像调用M函数那样调用MEX文件,如上面说到的例子。所以,通过MEX文件,使用C函数就和使用M函数是一样的了。
    4 I# L3 E1 I. _: n- b7 [我们现在来说mexFunction怎样写。
    & P8 ^" w/ e6 P( v, `1 S; imexFunction的定义为:' k  i  ^# U* t
    void mexFunction(1 Z; q+ `; g2 o8 `3 N
         int nlhs,
      Q# `/ r9 i( w; F/ A- [( C- [. n     mxArray *plhs[],
    " u4 I" J( u* N     int nrhs,7 Y' s) R6 L. |# u$ _, _
         const mxArray *prhs[]) {
      z! U* R/ q/ V/ n6 p, w2 O
      D7 \6 S% c8 ~5 m" I}
    4 O3 g3 n" }" u可以看到,mexFunction是没返回值的,它不是通过返回值把结果传回Matlab的,而是通过对参数plhs的赋值。mexFunction的四个参数皆是说明Matlab调用MEX文件时的具体信息,如这样调用函数时:
    ! K$ u- {7 [; q6 P+ D' Q( @>> b = 1.1; c = 2.2;
    3 G; g7 j. J1 b5 ?/ l>> a = add(b, c)
    ' t! x7 q8 t$ j& DmexFunction四个参数的意思为:1 _0 K+ T" V3 `
    nlhs = 1,说明调用语句左手面(lhsleft hand side)有一个变量,即a& z2 S& A' U4 m1 J3 r
    nrhs = 2,说明调用语句右手面(rhsright hand side)有两个自变量,即bc* t0 V, \4 u- N! ?6 \# \/ n2 S
    plhs是一个数组,其内容为指针,该指针指向数据类型mxArray。因为现在左手面只有一个变量,即该数组只有一个指针,plhs[0]指向的结果会赋值给a; A5 ~) D) m" B; X" I* _- H
    prhsplhs类似,因为右手面有两个自变量,即该数组有两个指针,prhs[0]指向了bprhs[1]指向了c。要注意prhsconst的指针数组,即不能改变其指向内容。! A$ S( ~* {+ B0 W% H
    因为Matlab最基本的单元为array,无论是什么类型也好,如有double arraycell arraystruct array……所以a,b,c都是arrayb = 1.1便是一个1x1double array。而在C语言中,Matlabarray使用mxArray类型来表示。所以就不难明白为什么plhsprhs都是指向mxArray类型的指针数组。  C* S& O7 v( M' L
    完整的add.c如下:
    * t8 J8 E( D  h5 @' P// add.c4 Z  i1 x' A! \- k) b1 _
    #include "mex.h" // 使用MEX文件必须包含的头文件 // 执行具体工作的C函数, y4 p% d' ~! p: Z; a/ o- ?
    double add(double x, double y) {! O4 a- M* i/ u" R; c* P: p1 I4 |
     return x + y;
    1 u4 V$ _# f5 s6 m! n( W) ?6 L& ]} // MEX文件接口函数/ U" ]1 L2 K# M( h
    void mexFunction(/ T7 n* [2 Q3 ~/ u( m1 d( `
     int nlhs,+ s- S8 F4 C, O3 h; `
     mxArray *plhs[],) t4 B  K9 g' C+ ^8 J( U
     int nrhs,( m- K0 {1 C, r. X
     const mxArray *prhs[]) {. w& ]: I; ?" _, b! z7 l" o) |
     double *a;
    7 g1 g. e- L) o  l# V7 x6 ` double b, c;! K8 e. w7 E2 {9 Z0 m  _
     plhs[0] = mxCreateDoubleMatrix(1, 1, mxREAL);8 N5 W' L! O# D5 T2 E! s/ f
     a = mxGetPr(plhs[0]);
    / v6 B& b' l0 z5 Y' [( c+ j* a b = *(mxGetPr(prhs[0]));
    ' n2 e1 |6 a: Q) [: Q9 {! { c = *(mxGetPr(prhs[1]));
    + A6 g" p8 X4 i, \ *a = add(b, c);9 ]1 @) j1 N# \. s* D& ^7 u7 O" {
    }
    # I* z" h5 @4 dmexFunction的内容是什么意思呢?我们知道,如果这样调用函数时:$ g2 `. K  `' ^  [
    >> output = add(1.1, 2.2);) R2 [5 r  J/ M( I9 B6 U1 r
    在未涉及具体的计算时,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便是已计算好的结果了。
    8 g; }; Y) _! w) t& T: o上面说的一大堆指向这指向那,什么mxArray,初学者肯定都会被弄到头晕眼花了。很抱歉,要搞清楚这些乱糟糟的关系,只有多看多练。4 }1 |* B3 ?( W$ P+ T
    实际上mexFunction是没有这么简单的,我们要对用户的输入自变量的个数和类型进行测试,以确保
    4 I7 K8 }4 F% a4 i" A* C输入正确。如在add函数的例子中,用户输入char array便是一种错误了。
    : w# p- y, W# t! N7 \从上面的讲述中我们总结出,MEX文件实现了一种接口,把C语言中的计算结果适当地返回给Matlab罢了。当我们已经有用C编写的大型程序时,大可不必在Matlab里重写,只写个接口,做成MEX文件就成了。另外,在Matlab程序中的部份计算瓶颈(如循环),可通过MEX文件用C语言实现,以提高计算速度。5 H# B; t6 t1 c3 ~+ a

    9 }' ^2 \7 B- C# ]: N*********************************************************************************************************************************************
    + @, ~: c7 S9 l5 L; T1 T% N
    " t: g8 \% N- y5 x/ N' \5 ^mex 的目的,
    : T  p8 A* z7 n8 q2 v
    * R8 L" F. I5 N' y通过C/C++语言编写代码,Matlab中将其编译成mex文件主要可以做以下几方面的事情:+ _- }' W" z. i
    8 c) i0 P& ?( U" S! V" N
    1、加快程序的执行速度. Matlabfor上如老牛拉车的速度确实让人抓狂.
    5 _" Q3 v* E+ u8 `% n: [% r1 Q) ~% ~! ]( t
    2、将Matlab作为C++的开发调试环境.尤其是有大量数据需要处理时,Matlab观察其中间结果十分方便.
    3 g+ b9 Z7 b5 j4 V! w8 e  P) ]( S4 |5 B* b
    3、据称可以弥补Matlab硬件设备接口的薄弱环节.
    ; g1 T( V, J3 q, S* [
    ; M6 T2 L( z& \  J今天写了第一个使用MEX.
    % x  `6 P% f) y$ K, I8 k) b- [9 ?7 P( S3 w% [) z' q
    一个简单的对Matlab普通数值矩阵的操作.
    / ?; N. G2 x# O; B5 ^/ s
    # Z9 U" v6 w' w4 r. z$ R% R其中Matlab规定的与操作系统版本有关的mwSize,mwIndex, size_t32位系统上其实本质上就是int,所以
    & E) I7 ^" a4 u( T3 v% Y+ C+ p; e, G  ^% ~
    一律用int代替.
    : o0 a# S7 z' p& N4 H* n
    3 j$ M, l: ^- _#include "mex.h". E9 f: F: r7 }) j2 o
    #include <iostream>! v0 P' D* i2 l

    ; ~0 Y& `2 w9 M# d' ]" d; `void mexFunction(int nlhs,mxArray *plhs[],int nrhs,const mxArray *prhs[])+ f3 V& n$ {: x5 x
    {
    , j" s. O6 ~' i, P
    % L& c, a& H1 I1 Z: vint i,j,k;
    ! y5 H" }  u' W  Oint index;
    1 K5 C0 v& t* o& Xdouble* pr=NULL;
    * t* z; {! @* b4 z. M; Odouble* pi=NULL;
    - `7 j# A' C9 gint M,N;3 l" W. |1 O9 {8 L
    int ndim;+ o2 O7 t2 a9 d4 e
    int dims[2];
    0 v, N/ A( f- l! K' Zfor (i=0;i<nrhs;i++)
    + _" u3 s2 Y: g( I* s* p{
    - J9 ^  q! ?0 T7 Y  V. _6 e7 h   if ((mxIsDouble(prhs))&&(mxGetNumberOfDimensions(prhs)==2))8 v7 g' w9 j- C' f1 m& @$ F
       {1 M. L8 U$ B' p. \8 N6 r" _  Q
        pr=mxGetPr(prhs);( S, ~! @5 {- P4 v, ?
        pi=mxGetPi(prhs);
    8 D+ J% R  I/ s* O- a7 c  I, B- }    M=mxGetM(prhs);! N/ _" B( ~. m# Q5 ^
        N=mxGetN(prhs);
    ! o/ A4 i$ h' f: h4 ]4 s8 a5 A    ndim=mxGetNumberOfDimensions(prhs);6 j7 d. q, d7 g

    % {. w/ v! O( T    mexPrintf("变量%d:\n",i);3 y+ L- F* t: c$ T+ Q+ D4 M
        for (j=0;j<M;j++)
    ! H7 p7 {. q! s9 C3 w    {% V  F+ @+ K, A4 t( F
         dims[0]=j;- B$ |9 j' @/ u0 F& u: s
         for (k=0;k<N;k++)4 Y) n- X1 f6 g6 E8 A
         {9 r( V& A  k9 w4 @; ~& {- t
          dims[1]=k;
      r7 d1 S" K% g* @. ~: r      index=mxCalcSingleSubscript(prhs,ndim,dims);" h5 s) V7 K+ t7 p5 u2 y& T- d2 E% [
          if (pi==NULL)6 ]7 R% R# t$ k# i: C0 i, n
          {
    4 K' |3 z3 n0 k- [4 r  n" ^: c       mexPrintf("%6.2f",pr[index]);
    $ `  _! ^8 q# s9 A      }
    4 y5 Y# R4 ^" [' r& z      else{
    . S3 R" D: c( F1 b0 w" V( f       mexPrintf("%6.2f+ %6.2fj",pr[index],pi[index]);& q9 p  H: g! X) g$ e$ ]  x
          }
    + j* i1 @9 c% k, i7 R) Z     }
    * B3 Y. }3 |8 l) H" j# b8 f     mexPrintf("\n");
    , A" _7 [3 Y4 J- X& C
    $ r& v# q5 D  Q/ _. m    }1 a& ~- c, C5 a3 R2 Z
      " E6 G/ L, q5 D1 G- T8 J  {
       }
    7 d4 J8 a/ k! f* N: Q6 S. {   else{
    * J  _8 ], L/ z9 M5 v4 X    mexPrintf("input NUMB %d matrix is not 2 dims&double numerical array\n",i);- t; u8 R/ J$ N- h
    }3 v/ ?4 v) R) f2 u
    " u1 D/ r- j& P9 F2 u7 A8 k! I! e& w

    & W. _( a3 e. E+ M}. j/ Y6 ~3 g( u5 H$ N( v4 _

    ) {5 u/ k( L, |* ~, l}8 O( Q. ?* r, [0 T' v& {" j
    ( T! E( k& e# C7 |1 V" V: K8 e1 Y
    Result:
    $ Y8 m/ l' S$ k2 Y  t' Y& J. m0 [/ Z; H6 i$ \: h
    >>mex test.cpp
    7 E% ~0 t3 h$ V4 a9 S+ ?% Z>> test(a,b,c)' Z( [3 G- Z2 [+ k! K
    变量0:* {# V/ y4 X4 l8 g; }0 j4 j) x
    0.35 0.62 0.83
    1 D$ ]' z0 Q/ p4 Y  w4 N0.20 0.47 0.59& }9 M; V) A0 I) }' {9 G
    0.25 0.35 0.55$ Q% A2 a/ ?' N
    变量1:5 }& q0 P9 E2 x
    0.92 0.38 0.53 0.57' o4 S4 l( l- D
    0.29 0.57 0.78 0.47. c2 B2 X4 W6 N
    0.76 0.08 0.93 0.01$ g2 D% T) I4 P
    0.75 0.05 0.13 0.349 J, h; S- X8 B% [, w
    变量2:" i: ^) [8 u# R5 t
    0.16+   0.87j 0.60+   0.43j 0.45+   0.14j 0.83+   0.85j 0.11+   0.08j( g0 F( M$ ~0 q$ O
    0.79+   0.08j 0.26+   0.91j 0.08+   0.87j 0.54+   0.62j 0.96+   0.24j" ?  f' z3 _6 V4 Q8 S. T0 F& W9 O
    0.31+   0.40j 0.65+   0.18j 0.23+   0.58j 1.00+   0.35j 0.00+   0.12j
    & f6 Z( V. D' ^$ Y+ d7 \0.53+   0.26j 0.69+   0.26j 0.91+   0.55j 0.08+   0.51j 0.77+   0.18j5 x. [- J3 f% x  d* I( K
    0.17+   0.80j 0.75+   0.15j 0.15+   0.14j 0.44+   0.40j 0.82+   0.24j5 D. a0 @$ h' o6 r; O8 q
    >> help test* K& T/ ]* s6 K9 o3 F
    本程序用于调试mx______函数.. \, |  U. ^/ c1 s7 X2 g
    ) {% O  s3 N+ P9 W1 j# ?) w: m; T
    # }6 {. e  P. R* O6 \: m- m5 Z
    本文来自: 高校自动化网(Www.zdh1909.com) 详细出处参考(转载请保留本链接)http://www.zdh1909.com/html/matlab/14744.html4 C( P- _% s5 D4 ]

    & z/ [9 X% P' K; N/ L3 G+ C下面是其附件,内容一样,方便下载 Matlab调用c程序.doc (41.5 KB, 下载次数: 10)
    zan
    已有 1 人评分体力 收起 理由
    天海星云 + 5 很不错的,鼓励共享。

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

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

    32

    主题

    50

    听众

    2957

    积分

  • 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-6 13:35 , Processed in 1.088315 second(s), 114 queries .

    回顶部