MATLAB与C语言接口.doc_第1页
MATLAB与C语言接口.doc_第2页
MATLAB与C语言接口.doc_第3页
MATLAB与C语言接口.doc_第4页
MATLAB与C语言接口.doc_第5页
已阅读5页,还剩49页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

MATLAB与C语言接口作 者 姓 名 张杰 专 业 信息与计算科学 指导教师姓名 李彬 专业技术职务 讲师 50目 录摘 要 1第一章 绪论21.1 MATLAB与C语言接口编程的好处21.1.1提高效率,突破瓶颈 21.1.2继承宝贵财富21.1.3优势互补 21.1.4编译器功能 31.2 本文特点和框架3第二章 编译器32.1 MEX文件的编译-MEX指令32.2 建立 MEX环境 52.2.1 Lcc编译器MATLAB环境配置 52.2.2 VC+编译器MATLAB环境配置 72.3用MATLAB插件在VC环境中编写编译链接C MEX函数 72.31 MATLAB插件在MSVC环境中的配置72.3.2 C MEX函数的编写编译链接过程示例102.4编译器的其他功能14第三章 MATLAB对C语言的调用MEX文件 153.1关与MEX文件 153.1.1 MEX文件的帮助信息153.1.2 mex库函数和mx库函数163.1.3mxArray结构体163.2MEX文件的组成和参数163.3编写C MEX函数的基本流程163.4MEX文件的例子203.4.1 Fibonacci数列MEX文件对C文件的调用203.4.2气泡法排序213.4.3 MATLAB的自带程序yprime 233.4.4MATLAB的另一自带示例程序- mexeval.c25第四章 C对MATLAB的调用-MATLAB计算引擎264.1关于引擎函数和引擎库264.2引擎函数调用格式264.3 C程序调用引擎函数示例264.3.1 一个简单的引擎函数264.3.2 MATLAB自带的C示例程序28第五章 数据交互-MAT文件315.1关于MAT文件和MAT库函数315.2 MAT文件的组成315.3 MAT文件的编译325.4 MAT文件的例子325.4.1一个存储C程序结果MAT文件的创建函数325.4.2创建C MAT 文件的例子345.4.3读取MAT文件的例子38第六章 结束语 42附录1 MEX命令参数43附录2 Mx库函数43附录3 mex函数库47附录4 C 引擎库函数 47附录5 C MAT-File 库函数48参考文献49致谢 50山东轻工业学院2007 届本科生毕业设计(论文)摘 要MATLAB是一个功能完善的程序设计和数据处理的软件,是一个完全独立的系统. MATLAB系统也是一个扩充的系统,MATLAB提供了接口:对用其他编程语言书写的外部程序,需要与外部程序共享的数据,等等。大多数的这些接口性能是以前在MATLAB应用程序接口,或API的标题之下涉及到的。本文介绍了MATLAB和C语言之间的接口,并通过例子,使得读者能够轻松的了解这种接口。本文主要介绍的内容包括:1) MEX文件,使可以在MATLAB环境下直接调用C语言编写的程序段。这样子能实现现有代码重用,有效利用前人留给我们已经编好的C程序这是一笔宝贵的财富。2) MATLAB计算引擎,在C语言中直接使用MATLAB的内置函数。我们将MATLAB当成一个计算引擎(ComputingEngine),并从程序调用此MATLAB引擎,进行MATLAB的各种运算或图形显示。3) MAT文件,实现MATLAB于C语言程序间的数据交换。在介绍了MATLAB与C语言之间的接口的一般理论后,文章通过丰富的例子说明接口的好处和必要性,调用的过程中应注意的问题:编译该注意的地方、调用格式等等。关键词:MATLAB C语言 接口 ABSTRACTMALTAB is a software of perfect function programming and data processing, which is a fully independent system. MATLAB is also an open-ended system and provides interfaces to external routines written in other programming languages, data that needs to be shared with external routines, and so on. Much of this interface capability was formerly referred to under the title of the MATLAB Application Program Interface(API). This paper introduces the external interfaces of the MATLAB and C language, you can understand it easily through the examples. The main topics included are:1) MEX files, which are the routines called the program by c language in the MATLAB. In this case, we can reuse the existing code,and use the C program segment which has been wrote-this is a precious fortune.2)MATLAB engine, which are the inline functions of the MATLAB and can be used in the c language. We regard the MATLAB as a Computing Engine, and we call this MATLAB Engine to run all kinds of operation and graphical display.3) MAT files, which exchange data between MATLAB and c language. After introducing the general theory of interface between MATLAB and C program, this article explain the advantage and necessity of the interface, the problem should be attentive in the calling process, the place should be attentive in the compiling process, the calling format and so on.Key words:MATLAB; C language; Interface 第一章 绪论MATLAB系统是一个功能完善的程序设计和数据处理的集成环境,使用它所提供的功能、内建函数以及大量的工具箱,几乎可以完成所有的任务,并且无需借助外界的帮助,是一个完全独立的系统。MATLAB系统更是一个友好的系统,MATLAB提供了功能完整的应用程序接口(ApplicationProgramInterface简称API)来和外部程序或其他程序语言沟通,只要遵循MATLABAPI的标准,可以实现以下几项接口工作:1)从MATLAB调用以C语言编写的函数;2)将MATLAB当成一个计算引擎(CompteringEngine),并从程序调用此MATLAB引擎,进行MATLAB的各种运算或图形显示;3)以C程序读写MATLAB专用的MAT文件。当然,MATLAB与其他语言之间的接口和相当丰富和完善,例如从MATLAB调用以Fortran语言编写的函数;从Fortran程序调用MATLAB引擎;以Fortran程序读写MATLAB专用的 文件;MATLAB与微软程序(Excel或Access)之间的交互;MATLAB与Java之间的接口等等3。但是,这些都不是本文讨论的内容,本文要讨论的是MATALB与C语言之间的相互调用,主要讨论点就是上述三点。1.1 MATLAB与C语言接口编程的好处MATLAB是一个功能强大的软件,但是有了与其他语言之间的接口,MATLAB的功能更加的完善,因为应用接口编程,有诸多好处:1)提高MATLA的执行效率,解决 语言运算速度的瓶颈;2)充分的利用前人留下的已经被实践证明稳定有效的C程序,继承这笔宝贵的财富;3)实现MATLAB与C语言之间的优势互补;4)利用编译器,可以实现隐藏代码,生成独立应用和M文件到C文件的自动转化,满足不同的人的不同需求。1.1.1提高效率,突破瓶颈当使用 MATLAB进行大规模的数据处理时,MATLAB无法避免使用for循环或while循环,由于MATLAB本身对于循环执行效率较低,会出现运算速度的瓶颈。通过C语言编写 MEX文件,然后在MATLAB中调用,从而大大地提高数据处理效率。有人以移动通信中误码率的统计作一个运算速率的分析与比较,文件的运算速率是M文件的运算度的300倍3。1.1.2继承宝贵财富语言已经有着广泛的应用,有大量的程序代码,如卷积编码,卷积解码,Turbo编码,Turbo解码等等,可将其作为计算子程序,通过C MEX函数的接口程mexFunction 函数生成C MEX文件,可以在MATLAB系统中如调用MATLAB的内建函数一样调用生成的C MEX文件,从而使资源得到充分利用,避免重复的算法设计工作。从本文中的MEX文件也能很容易的体会到这一点,参见文中的其他例子。1.1.3优势互补例如C语言调用MATLAB引擎,弥补C语言在计算,画图等方面的不足;有时候C语言对某些字符处理方便,能弥补MATLAB在这方面的不足,从文章中给出的例子,我们很容易体会到这点。1.1.4编译器功能的源代码经过编译后,已变成二进制的代码,虽然MATLAB能够调用它,但使用者无法看到源程序代码了。因此,采用 文件的形式,就可以隐藏程序代码,达到保护知识产权的目的3。用mcc函数就可以实现M文件到C文件的转化,甚至是二进制的文件。并且利用编译器还能构生成独立的可执行程序,可以脱离MATLAB的执行环境。1.2 本文特点和框架 作为计算机语言,在使用的时候都有一套自己特定的语法,MATLAB与C语言之间的接口也不例外。本文没有涉及太过复杂的理论知识和应用举例(而且限于篇幅,也不能这么做),只是在介绍了基本的理论知识的准备之后,通过一些简单易懂的举例,来说明MATLAB与C语言之间调用的格式,使得有了MATLAB和C语言基础的读者能够轻松易懂的了解这种调用,力求达到深入浅出的效果。 本文总共分为六章。第一章,绪论,介绍了MATLAB和C语言之间接口调用的好处和本文的特点。第二章,是对MATLAB与C语言之间调用的概述和基本理论知识的准备。第三,四,五章,分别详细介绍了MATLAB调用C语言中的MEX文件,计算引擎和MAT文件的程序的组成结构、编译方法、注意事项等等,是这片文章的主要部分。第六章,是结束语。第二章 编译器一个C MEX文件在编写好了以后,还要进行编译和链接生成.dll文件以后,才能最终调运和执行。本章主要对C MEX文件的编写、编译、链接的过程进行讨论,举一反三,MAT文件和以MATLAB为计算引擎的C函数的编写、编译、链接的过程类似。2.1 MEX文件的编译-MEX指令一个MEX文件在编写好了以后,要进行编译和链接才能最终生成可执行的程序文件。MATLAB语言中提供了函数mex用以编译MEX文件,完整的MEX指令格式如下:MEX option1optionNsourcefile1sourcefileN objectfile1objectfileN libraryfile1libraryN其中,option1optionN是MEX指令的命令行参数选项;sourcefile1sourcefileN为参与编译生成MEX文件的所有C原文件;objectfile1objectfileN为参与编译的对象文件;libraryfile1libraryN为参与编译的函数库文件;这里命令行参数包括多种,以下是其中几种:-c 对源代码仅做编译而不连接;-setup 编译器的设置;-f(file) 以file文件选项文件对MEX文件进行编译,如果文件不在当前目录,则应当使用包含路径的全称文件名;还有很多其他的控制参数,这里不在一一介绍。详细的参数设置参见附录1如果是第一次编译MEX文件,但是对编译器的选项文件,也就是上述的控制字符串不熟悉,那么可以简单的以以下形式编译,在MATLAB的命令窗口输入: mex file.c其中file.c包括文件的完整的路径,但是如果待编译的文件所在目录正好是当前目录,那么路径名可以省略;输入上述命令回车后,会出现以下类似提示: mex matmax.cSelect a compiler: 1 Lcc C version 2.4 in C:MATLAB6P5P1syslcc 2 Microsoft Visual C/C+ version 6.0 in C:Program FilesMicrosoft Visual Studio 0 None Compiler: 1The default options file: C:Documents and SettingsSicentApplication DataMathWorksMATLAB R13mexopts.bat is being updated from C:MATLAB6P5P1BINWIN32mexoptslccopts.bat. 这是提示用户选择一个编译器,选择以后下次再编译时,这个被选定的编译器将会被作为默认的编译器供用户使用,如果这时用户想改变编译器的类型,可以用setup控制参数实现。 在MEX文件被编译以后,在MATLAB中调用MEX文件也相当的方便,其调用方式与使用MATLAB的M文件相同,只需在命令窗口键入相应的MEX文件名即可。一些更具体的编译和调用的方法参见本文中的例子。这里,不再对UNIX系统下参数作说明了。如有需要,请参见helpmex命令下所显的所有信息。一般高级语言从编写源代码开始到最终的可执行程序的生成过程主要包含三个步骤:1)编写源代码 利用代码编写器,如VC+或 MATLABedit编辑器,进行语言的源代码编写。2)编译 这一步是对源代码进行编译,主要检查程序源代码是否有语法和词法错,将源文件编译成目标文件。3)链接这一步是链接过程,主要是将源文件生成的目标文件、必要的库文件及其的目标文件链接在一起,生成最终可执行的程序文件。因此,在生成语言 文件的过程中,同样也要经历这三个步骤。2.2 建立 MEX环境如果用户希望编译生成C MEX文件,首先必须具备两个最基本条件:其一是要求已安装了 MATLAB应用程序接口组件及其相应工具;其二是要求有合适的语言编译。如果用户的操作系统是MicrosoftWindows平台,那么用户所使用的语言编译器必支持32位 Windows动态链接库才能满足要求。当具备了这两个条件后,也就具备了最基本的编译生成C MEX文件的基础。但是编译C MEX文件之前还必须要以MATLAB进行编译器配置,以使MATLAB知道用所使用的编译器类型及其路径。MathWorks公司的开发者为了简化配置工作,在Windows下为命令mex提供了setup,当用户键入命令mex setup之后,只要简单地回答系统的提问,即可完成全部的配置工作。以Windows 2000和MATLAB 6.5为例,在 MATLAB 6.5中可以支持17种编译器,其中包括Borland C+,VC+,Lcc C version2.4(MATLAB本身内嵌的编译器)等等在这里,仅介绍两种编译器的配置方法:1)Lcc complier2)Microsoft Visual C/C+ Version6.0 complier2.2.1 Lcc编译器MATLAB环境配置MATLAB本身内嵌有Lcc编译器,可以用于C MEX函数的编译链接,因此在不需要额外安装任何语言编译器的情况下,就可以编译C MEX函数。但Lcc不支持汉语注释,因此在用Lcc编译时,一定要用英语注释,否则编译链接是通不过的。1)Lcc编译器的系统配置步骤(1)运行mex setup命令mex -setupMATLAB系统将显示如下内容:Please choose your compiler for building external interface (MEX) files: Would you like mex to locate installed compilers y/n?(2)用户选择yes,键入y提示用户选择yes或no,以确定是否让mex命令自动定位用户计算机中已安装的各类型的编译器,键入y,表示同意后,mex命令将列出用户计算机中所有的MATLAB认识的编译器。如果键入n,mex命令将列出MATLAB所支持的所有的编译器。当计算机中安装了Digital Visual Fortran version 6.0 ,Microsoft Visual C+ 6.0和MATLAB V6.5自带的Lcc编译器时,键入y后,mex执行的结果如下:Would you like mex to locate installed compilers y/n? YSelect a compiler: 1 Digital Visual Fortran version 6.0 in C:Program FilesMicrosoft Visual Studio 2 Lcc C version 2.4 in C:MATLAB6P5P1syslcc 3 Microsoft Visual C/C+ version 6.0 in C:Program FilesMicrosoft Visual Studio 0 None Compiler:(3)选取C编译器,键入2提示用户选择哪一个编译器作为默认的C MEX编译器,所以键入2后,mex命令将进一步显示执行结果如下:Compiler: 2Please verify your choices: Compiler: Lcc C 2.4 Location: C:MATLAB6P5P1syslcc Are these correct?(y/n):(4) 确认Lcc编译器路径,并显示Lcc编译器配置成功信息确认用户所选择的编译器的路径是否正确,如果正确,键入y后,mex命令将对MATLAB系统进行配置,若成功将显示:Are these correct?(y/n): YThe default options file: C:Documents and SettingsSicentApplication DataMathWorksMATLABR13mexopts.bat is being updated from C:MATLAB6P5P1BINWIN32mexoptslccopts.bat. 在Lcc编译器配置好之后,就可以编写、编译、链接C MEX函数,通常有两种编辑方法编写C MEX函数:一是用MATLAB本身的程序编辑器;二是用VC+等其他编辑软件。VC+优点是它本身支持语言格式,编写程序方便、灵活(这时的文件扩展名为.c,而不是.cpp)。2)用MATLAB本身的程序编辑器编写C MEX函数的步骤(1)在MATLAB窗口中键入edit或edit welcome.cedit(2)在edit窗口中编写C MEX函数在键入edit之后,MATLAB会弹出edit窗口,在MATLAB编辑窗口中编写C MEX函数后,可以选择保存路径保存所编辑的文件。3)用VC+编辑器编写C MEX函数在VC+中可以识别语言的特殊字符,如void、#include、double、int等字符,因此编写程序灵活方便。无论选用哪种程序编辑器都是可行的,在编写好C MEX函数之后,将它存放在你想存放的任何一个目录下,这时就可以编译链接welcom.c这个C MEX函数,命令格式如下:mex welcom.c如果当前目录不是文件的所在目录,那么编译时要写全文件的路径名;如果文件正好放在当前目录中,那么路径名则可以省略。更详细的mex使用方法,请在 MATLAB命令窗口中键入helpmex命令查询。2.2.2 VC+编译器MATLAB环境配置MATLAB本身支持Microsoft Visual C/C+ 5.0,6.0,7.0各个版本的语言编译器,因此如果在用户的计算机上装有Microsoft Visual C/C+上面三个版本的任何一个版本的程序时,用户就可以进行编译器的系统配置。VC+编译器的系统配置步骤和Lcc的编译器的配置步骤相同,也是用命令: mex setup进行设置,然后只需根据系统提示依次回答问题即可。在VC+编译器配置好之后,就可以编写、编译、链接C MEX函数,通常有两种编辑方法编写C MEX函数:一是用MATLAB本身的程序编辑器;二是用VC+等其他编辑软件。具体方法如前面所述。2.3用MATLAB插件在VC环境中编写编译链接C MEX函数用MS VC+编写调试C MEX函数通常有两种方法:一种是在MATLAB的环境中调试;另外一种就是使用MATLAB为MSVC设计的插件的方法。在这里主要介绍 MSVC件的方法,MathWorks公司提供了一个MATLAB插件用于Vsiual Studio系统,利用这个MATLAB插件,我们可以在MSVC环境中实现C MEX编写与调试。2.31 MATLAB插件在MSVC环境中的配置在MATLAB命令窗口中运行mbuild -setup或mex -setup时,用于Vsiual Studio的插件会自动安装到系统中,因此MSVC插件的配置主要分两大步:第一步是在MATLAB环境中进行编译器配置;第二步是在Microsoft Visual C+中进行MATLAB插件配置。具体步骤如下:1)在MATLAB环境中配置VC+编译器具体步骤参见:2.2.2编译器系统配置。2)在Visual Studio环境中配置MATLAB插件在MATLAB环境中配置好VC+编译器之后,就要在Visual Stdio环境中配置MATLAB插件,让它能和Microsoft Visual C/C+ 一起运行。(1) 运行MSVC 6.0,如图2.1所示:图2.1 Microsoft Visual C+6.0运行窗口(2)从MSVC菜单中选取“工具”菜单下“定制”命令,会弹出定制命令窗口,如图2.2所示:图2.2 定制命令窗口(3)在定制命令窗口点击“附加项和宏文件”标签,会出现附加项和宏文件标签,如图2.3所示:图2.3 选择附加项和宏文件标签(4)在附加项和宏文件标签中选取MATLAB Add-in,并点击关闭按钮,关闭附加项和宏文件命令窗口,如图2.4所示:图2.4 选择MATLAB Add-in(5)配置完成后,在Visual Stdio中会出现一个浮动的MATLAB插件(工具栏1)的工具条,如图2.5所示。图2.5 MATLAB Add-in工具条2.3.2 C MEX函数的编写编译链接过程示例在MSVC插件配置好之后,就可以用MATLAB插件在Visual Studio中编写、编译、链接C MEX函数,具体步骤如下:(1)运行Visual C+6.0,运行的结果显示如上图2.5所示。(2)从菜单条上选取“文件”菜单下的新建命令,在弹出的“新建”对话框中选择“工程”标签,如图2.6所示:图2.6 新建对话框中工程标签(3)在“新建”对话框“工程”标签中选取“MATLAB Project Wizard”作为工程类型,如上图2.6所示。(4)在“平台“选项中选中Win32项,如图2.7所示: 图2.7 选中Win32项 图2.8 工程名称及目录(5)将“工程名”称设为hello,并将“位置”设为C:Program FilesMicrosoft Visual StudioMyProjectshello目录下,如图2.8所示,并点击“确定”。(6)选取“Visual MATLAB Application Type“下拉框中选择“C-MEXDLL”,再选中“Generate main file”单选框,最后点击“完成”按钮,如图2.9所示:图2.9 MATLAB工程的设置(7)点击完成按钮后,出现“新建工程信息”窗口,并点击“确定”,如图2.10所示:图2.10 新建工程信息窗口(8)点击“确定”后,会出现选择文件对话框,到hello工程所在目录查找hello.c,并点击“打开”,如图2.11所示:图2.11 选择文件对话框(9)点击打开后,会出现VC+编译器的界面,在左边的Workspace中点击MATLAB C/C+ files-hello.c,并编写hello.c,如图2.12所示:图2.12 编写C MEX函数hello.c(10)编译和链接hello.c,生成hello.obj文件和hello.dll文件 ,如图2.13所示。图2.13 编译和链接C MEX函数hello.c的过程(12)测试hello.dll,在MATLAB命令窗口下,键入hello(hello.dll在MATLAB的当前工作目录中),会出现“Hello World!”,说明C MEX函数的编写正确无误,如图2.14所示:图2.14 测试C MEX文件hello.dll的过程2.3.3编译器的其他功能 MTALAB编译器(mcc)可以将M文件转化为C文件。其实,mcc就是一个函数,具体的调用格式: mcc -optionsfunfun2mexfile1mlibfile1 此函数的主要功能是将MATLAB程序fun.m转化为c语言函数fun.c,甚至是某种二进制的文件。转化的文件默认被放在当前的目录下。若M文件多于一个,则每个M文件都会生成一个相应的C文件。若源文件中包括有C文件则他们将同新生成的C文件一起编译。但是,在MATLAB中非常简单的一段程序在转化为C语言之后会变的非常复杂。在用mcc 函数把M文件转化为C文件以后,用户就可以在其他的C程序中方便地调用这些程序了。 改变上面mcc函数调用的参数-option,可以直接得到可执行程序;或者对转化好的C文件程序用mbuild编译指令进行编译,可以得到可执行的二进制文件1。 关于编译器的更详细的用法,限于篇幅,不再介绍,参见参考文献1。 第三章 MATLAB对C语言的调用MEX文件3.1关与MEX文件 MEX文件是一种具有特定格式的文件,是在MATLAB环境下调用外部程序的应用接口,通过MEX文件,可以在MATLAB环境下调用由C编写的应用程序模块。重要的是,在调用的过程中,不需要对所调用的程序做任何的重新编译处理;此外,通过MEX文件可以把在MATLAB中执行效率较低的运算转移至C语言中来完成,这样可以大大的提高整个程序的执行速度;再有,前人编写的大量的C程序,不必用M文件重写了。在不同的操作系统上,文件名的后缀是不同的,在 MicrosoftWindows系统中,MEX文件类型的后缀名为dll(dynamiclinklibrary)(是指MEX文件编译以后生成的文件名的后缀名,参见后面的例子)。3.1.1 MEX文件的帮助信息 在MATLAB中MEX文件的调用优先级高于M文件,所以,即使MEX文件可能会与M文件重名,也不会影响其执行,而且,利用这一性质,我们可以为MEX文件另建一个辅助同名的M文件来存放MEX文件的帮助信息。因为MEX文件本身不带有MATLAB可识别的帮助信息,也就是说在MATLAB环境下,通过帮助系统得不到MEX文件相应的帮助信息,但是,获取帮助的发表程度所程序设计好坏的一个重要的标志,为了解决该问题,在实际操作中,一般所为MEX文件建立同名的M文件,并在该M文件中,给出相应的帮助信息,这样在查询所使用的MEX文件的帮助时,就可以通过MATLAB的帮助系统查看同名的M文件的帮助来获得相应的帮助1。因此,在同一个目录上应存在三个相同文件名,不同扩展名的三个文件。例如,它们分别为:1) C MEX函数:turbo-encoder.c用以生成C MEX文件;2) C MEX文件: turbo-encoder.dll用以完成计算功能;3) M文件: turbo-encoder.m用以提供帮助信息。如果为了保护算法设计,可将turbo-encoder.c移走。33.1.2 mex库函数和mx库函数 在MEX文件中经常用到的函数库为”mx库函数”和“mex库函数”,前者的作用是提供了在C语言中编辑mxArray结构体对象的方法;而后者的作用则是提供C语言于MATLAB的交互操作。“mx函数库“和”mex函数库“所提供的函数操作所构建MEX文件的基础,几乎所有的API操作都是与这两个函数库密切相关的1。 mx函数库中的函数非常多,这里不再一一列举。部分mx函数的参数,返回值,调用方式等信息参见附录2,mex函数的信息参见附录3。3.1.3mxArray结构体mxArray常常作为输入参数的数据类型出现,该数据类型所MATLAB矩阵在C语言中的表述,所一种已经在C语言头文件matrix.h中预定义的结构体类型,所以在实际编写MEX文件的时候应当在文件的开始声明这个头文件,否则,在执行的过程中会报错1。通过调用matrix.h头文件就可以用C语言实现对MATLAB 生成矩阵的运算,由于MATLAB的接口函数对mxArray的结构体做了很好的封装,所以具体的操作过程中,无需了列结构体个个部分的具体含义,而只需了解作为其操作工具的”mx库函数”,这样大大方便了MEX文件的设计,使得不必为不同的操作系统或不同版本的语言系统而改动程序1。例如:int mxGetM(const mxArray *array_ptr);int mxGetN(const mxArray *array_ptr);double *mxGetPr(const mxArray *array_ptr);double *mxGetPi(const mxArray *array_ptr);等等;用户只需知道对于不同类型的阵列,如常量、矢量、矩阵、数组等通过相应的mx为前缀的函数获取相应的行数、列数、实部数指针、虚部指针等mxArray结构体的参数就可以了,本文的后部分针再程序举例中对不同的数据类型进行详细地举例说明。3.2MEX文件的组成和参数MEX文件的源代码有两个部分组成:1) 计算过程。该过程包含MEX文件中完成计算功能的代码,该计算可以是数值计算,也可以是数据的输入和输出。2) 入口函数。该过程提供计算过程于MATLAB之间的接口,该接口提供入口函数mxFunction实现。入口过程把计算过程看作一个子过程来调用。MEX文件的两个组成部分可以分开,也可以组合在一起,入口过程的名称必须始终是mexFunction,并且包含四个参数:Void mexFunction(int nlhs,mxArray*plhs,int nrhs,mxArray *prhs)*参数nlhs和nrhs分别指调用MEX文件时左端变量和右端变量的个数。关也左端右端的由来,是因为在MATLAB程序的语法中,函数具有以下形式:a,b,c.=fun(d,e,f.)其中省略号表示同样格式的其他选项,a,b,c等为左端变量,d,e,f等为右端变量。入口函数中参数plhs和prhs是包含MEX文件左端变量和右端变量的指针。这两个变量都声明为mxArray*类型,表示所指的变量是MATLAB数组。而且,pshs是一个长的为nrhs的指针数组,plhs是一个长度为nlhs的指针数组。 例如,用下面的命令调用MATLAB工作空间的MEX文件:x=fun(y,z);MATLAB解释器调用mexFunction函数,变量nlhs=1,nrhs=2,plhs是一个只有一个元素的C数组,该元素是一个空指针,prhs是一个二元素C数组,其中第一个元素是一个指向mxArray型变量的指针,第二个元素为指向mxArray变量z的指针2。3.3编写C MEX函数的基本流程要生成在 MATLAB中使用的C MEX文件,首先要编写C MEX函数。在编写C MEX函数之前,必须确定在MATLAB中要使用的C MEX文件当它以 m文件存在时的各个参数情况。也就是说要对输入参数、输出参数的个数、类型、维数有一个明确的了解。作者将要编写的C MEX函数为:add_mlt.c用以生成C MEX文件add-mlt.dll,当add_mlt.dll以add_mlt.文件存在时,其语句如下:functionC,D=add_mlt(A,B)C=A+B;D=A*B;可以从上面add_mlt.文件得到以下信息,这些信息对于C MEX函数add_mlt.的编写是极为重要的。具体信息如下:(1)输入参量为A,B(2)输入参量的个数为(3)输出参量为C,D(4)输出参量的个数为(5)输入参量的数据类型:A,B均为double(6)输出参量的数据类型:C,D均为double(7)输入参量的维数:A为维数组,B为维数组(8)输出参量的维数:C为维数组,D为维数组(9)C与A和B之间的行数和列数之间的约束关系,及运算关系C=A+B(10)D与A和B之间的行数和列数之间的约束关系,及运算关系D=A*B在分析了所要编写的C MEX函数add_mlt.c要在MATLAB中所实现的功能以及输入参量,输出参量的个数、类型、维数信息之后,可以按照编写C MEX函数的基本步骤编写C MEX函数add_mlt.c,C MEX函数add_mlt.c的编写步骤如下:第一步:编写C MEX接口函数。#include “mex.h”#define A_IN 0#define B_IN 1#define C_OUT 0#define D_OUT 1void mexFunction( int nlhs,mxArray *plhs,int nrhs,const mxArray *prhs ) *在此编写相应代码*第二步:定义输入变量和输出变量的类型及维数。*定义输入和输出参量的指针* double *A,*B,*C,*D;*定义各个指针的行数和列数*int MA,NA,MB,NB,MC,NC,MD,ND; /MA表示指针A的行数,NA表示指针A的列数第三步:检查输入和输出参量的个数。*检查参量的个数(包括输入和输出)*if(nrhs!=2)mexErrMsgTxt(“Two input required”);else if(nlhs2) mexErrMsgTxt(“Too many output arguments”);第四步:检查输入参量的数据类型。*检查输入参量的数据类型*if(!mxIsDouble(prhsA_IN)|mxIsComplex(prhsA_IN)| !mxIsDouble(prhsB_IN)|mxIsComplex(prhsB_IN)mexErrMsgTxt(“Inputs must be double.”);第五步:获取输入参量的维数。*获取输入参量的维数*MA=mxGetM(prhsA_IN);NA=mxGetN(prhsA_IN);MB=mxGetM(prhsB_IN);NB=mxGetN(prhsB_IN);第六步:检查输入参量的维数条件。*检查输入参量的维数条件*if(MA!=MB|NA!=NB) mexErrMsgTxt(“dimensions of input shouble be same”);if(NA!=MB) mexErrMsgTxt(“Colum of A shouble be equal to Row of B.”);第七步:设定输出参量的维数。*设定输出参量的维数*MC=MA; 输出参量犆矩阵的行数NC=NA ; 输出参量犆矩阵的列数MD=MA ; 输出参量犇矩阵的行数ND=NB ; 输出参量犇矩阵的列数第八步:生成输出参量的mxArray结构体。*生成输出参量的mxArray结构体*plhsC_OUT=mxCreateDoubleMatrix(MC,NC,mxREAL);plhsD_OUT=mxCreateDoubleMatrix(MD,ND,mxREAL);第九步:获取输入参量的指针。*获取输入参量的指针*A=mxGetPr(prhsA_IN

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论