毕业设计(论文)-MATLAB与VC交互的研究与实现.doc

上传人:哈尼dd 文档编号:3944474 上传时间:2019-10-10 格式:DOC 页数:38 大小:1.04MB
返回 下载 相关 举报
毕业设计(论文)-MATLAB与VC交互的研究与实现.doc_第1页
第1页 / 共38页
毕业设计(论文)-MATLAB与VC交互的研究与实现.doc_第2页
第2页 / 共38页
毕业设计(论文)-MATLAB与VC交互的研究与实现.doc_第3页
第3页 / 共38页
毕业设计(论文)-MATLAB与VC交互的研究与实现.doc_第4页
第4页 / 共38页
毕业设计(论文)-MATLAB与VC交互的研究与实现.doc_第5页
第5页 / 共38页
点击查看更多>>
资源描述

《毕业设计(论文)-MATLAB与VC交互的研究与实现.doc》由会员分享,可在线阅读,更多相关《毕业设计(论文)-MATLAB与VC交互的研究与实现.doc(38页珍藏版)》请在三一文库上搜索。

1、ANYANG INSTITUTE OF TECHNOLOGY 本本 科科 毕毕 业业 论论 文文 MATLAB 与与 VC 交互的研究与实现交互的研究与实现 Reserching and Realization of MATLAB and VC interaction 系(院)名称: 电子信息与电气工程学院 专业班级: 04 级自动化 1 班 学生姓名: 指导教师姓名: 指导教师职称: 讲 师 2008 年 05 月 - I - MATLAB 与与 VC 交互交互的研究与实现的研究与实现 专业班级:04 级自动化 1 班 学生姓名: 指导教师: 职 称: 讲 师 摘要摘要:本文研究并实现了MA

2、TLAB与VC+的交互方法。该方案能充分利用MATLAB丰 富的控制算法、强大的数据处理功能和VC+方便、快捷、灵活的特点。作为世界顶尖的 数学应用软件,以其强大的工程计算、算法研究、工程绘图、应用程序开发、数据分析 和动态仿真等功能,在各个领域发挥着越来越重要的作用。而VC+语言功能丰富、使用 灵活方便,目标程序效率高。其既有高级语言的优点,又有低级语言的特点。在VC+6.0 中,可以方便、快捷的生成所需的DLL(动态链接库)项目, DLL项目具有很强的通用 性和实用性,并且代码的运行效率高,具有开发周期短、软件容易维护等诸多优点,是 一种很好的编程方法。 本文充分利用VC+和MATLAB的

3、各自优势,在VC+软件中开发用户界面、数据采 集的管理程序,对于数据的计算和显示则通过图形功能强大的MATLAB程序来实现,这 样就可以大大提高软件执行的速度、开发效率和可靠性。本文主要实现了以下四种Matlab 和C的交互的方法:(1)将Matlab程序编译成Mex文件,C或C+文件;(2)在C,C+程序中利 用Matlab Engine调用Matlab函数;(3)在C,C+程序中利用Matlab C Matlab Library或 MatlabC + Matlab Library调用Matlab函数;(4)利用MATCOM转化。 关键词关键词:Matlab引擎;数学库和图形库;mex mc

4、c;MIDEVA;VC - II - Reserching and Realization of MATLAB and VC interaction Abstract: This article studied and has realized MATLAB and the VC+ interactive method. This plan can use the MATLAB rich control algorithm, the formidable data processing function and VC+ fully convenient, quick, the nimble c

5、haracteristic. As the world apexs mathematics application software, by its formidable functions and so on engineering calculation, algorithm research, project cartography, application procedure development, data analysis and dynamic simulation, is playing more and more vital role in each domain. But

6、 the VC+ language function is rich, use nimble convenient, the target program efficiency is high. Its both have the higher order language merit, and has the low-level language characteristic. In VC+6.0, DLL which may convenient, the quick production need (dynamic link storehouse) the project, the DL

7、L project has the very strong versatility and the usability, and the code operating efficiency is high, has the development cycle to be short, the software easy to maintain and so on many merits, is one very good programming method. This article uses VC+ and the MATLAB respective superiority fully,

8、develops the user interface, the data acquisition executive program in the VC+ software, realizes regarding the data computation and the demonstration through the graph function formidable MATLAB procedure, like this may enhance the software execution greatly the speed, the development efficiency an

9、d the reliability. This article has mainly realized following four kind of Matlab and the C interactive method: (1) Matlab program compiling Mex document, C or C+ document; (2) transfers the Matlab function in the C, C+ procedure using Matlab Engine; (3) transfers the Matlab function in the C, C+ pr

10、ocedure using Matlab C Matlab Library or MatlabC + Matlab Library; (4) using the MATCOM transformation. Key words:The engine of MATLAB;The library of mathematics and graph;Mex;Mcc; MIDEVA;VC 目目 录录 摘要摘要.I AbstractII 引言引言.1 第一章第一章 VC 和和 MATLAB 介绍介绍.3 1.1 VC 开发软件简介3 1.1.1 VISUALC+集成开发环境简介.3 1.2 MATLAB

11、简介.4 1.3 动态链接库技术 5 第二章第二章 VC 调用调用 MATLAB7 2.1 VC 通过 MATLAB 引擎调用 MATLAB.7 2.1.1 在 VC 下建一个基于对话框的应用程序.8 2.2 VC 通过 MATLAB 库函数实现混合编程.10 2.2.1 C 语言实现 M 文件的方法 .13 2.2.2 库函数的使用制约.16 2.3 VC 使用 MATCOM(MIDEVA)调用 MATLAB 17 第三章第三章 MATLAB 平台下调用平台下调用 VC20 3.1 MEX 文件的组成及应用.20 3.2 使用 C 编写 MEX 文件.21 3.2.1 使用 MEX 文件27

12、 3.3 C 语言程序 MEX 文件实例28 结论结论31 致谢致谢32 参考文献参考文献33 1 引引 言言 Matlab是MathWorks公司于1982年推出的一套高性能的数值计算和可视化软件。它集 数值分析、矩阵运算、信号处理图形显示甚至符号运算功能于一体,构成了一个方便、 界面友好的用户环境。它还包括了有各个领域专家相继推出的工具箱,借助于这些“巨人 肩上的工具”,各个层次的研究人员可直观、方便地进行分析、计算及设计工作,从而 大大地节省时间。Matlab具有可扩展性、易学易用性、高效性等特点。 然而 Matlab 自身所存在的某些缺点限制了它的应用范围。(1)Matlab 以解释方

13、式执行 效率很低,这在处理图像是特别明显;(2)Matlab 程序不能脱离其环境运行,因此它不能 被用于开发商用软件;(3)Matlab 的程序是后缀为 m 的脚本文件它代码的完整性和安全性, 并不希望用户了解或更改核心程序;(4)其界面编写功能也过于简单,以致不能满足用户 的高级需求。 实际应用中,任何一个软件平台都不是万能的,MATLAB 软件平台就缺少直接操作 计算机硬件相关的命令与函数。对一些既要应用 MATLAB 软件平台独特功能,又要直接 操作计算机硬件,尤其是涉及到数据采集与输出控制的应用场合带来一定的不便。 VisualC+已成为Windows系统平台上最强大的应用程序开发系统

14、,因为VisualC+开 发的程序文件小,执行速度快、实时性好,已成为操作系统、设备驱动程序和系统级平台 类软件的最佳开发工具。Matlab由于其绘图功能强大,较之VC其语言更为简洁明了,并 且生成的图形可轻松实现多种功能,诸如图形添加文字说明、缩放、旋转、坐标轴标注、 曲线说明等等,这些若由VC来实现将极为复杂。因此如果把Matlab的程序加入到自己的 VisualC+程序中,将大大减少编程的工作量、保证程序的准确性,并且继承这些可视化变 成工具良好的用户界面。对于很多的工程项目特别是在数值化计算程度高的应用程序开 发中,通过二者的混合编程,即采用VC+完成框架定制和界面开发,利用Matla

15、b强大的矩阵 计算和操纵以及数值分析功能,完成核心数值计算和算法设计,实现应用程序的快速开 发,而且VisualC+可以实现更多的功能,来实现用户越来越高的要求。 Matlab和C的交互方式共有四种:(1)将Matlab程序编译成Mex文件,C或C+文件;(2) 在C,C+程序中利用Matlab Engine调用Matlab函数;(3)在C,C+程序中利用Matlab C Matlab Library或MatlabC + Matlab Library调用Matlab函数;(4)利用MATCOM转化。其中 通过方式(1)(2)生成的程序只有在安装了Matlab系统上才能正常运行,而由方式(3)生

16、成的 程序则没有这样的要求,它能够以独立执行程序的形式运行,即使在客户没有安装Matlab 2 系统下。用方式(4)生成的代码可读性好,支持图形函数,支持M文件编译过程中的文件 嵌套情况,可脱离Matlab环境,其缺陷为待编译的M文件不能涉及Matlab的内部类。方式 (3)唯一的缺点就是不能利用Matlab中丰富的图形句柄处理函数,但是对于Visual C+等开 发工具而言,这不是一个很严重的问题。因此方式(3)是实现功能和效率兼顾的最好接口 方法。 本文将详细介绍VC+和Matlab的交互的实现方法并进行简单的比较。 3 第一章第一章 VC 和和 Matlab 介绍介绍 1.1 VC 开发

17、软件简介 二十世纪九十年代以来,伴随着计算机硬件技术的高速发展,Windows操作系统形成 了垄断地位。Windows应用软件也蓬勃发展,广泛应用与各个行业,包括科研和生产制造 业。 对于Windows应用软件的开发,微软公司业提供了强大、复杂的开发工具 VsualC+(以后简称VC+),借助其生成代码的向导,能快速生成可运行的Windows应用 程序外壳框架。VC+附带的基本类库,即MFC(Microsoft Foundation classes)不同于从前 进行Windows开发所用的API函数 (Applieation Programming Interface),已经成为许多C+ 编译

18、器进行Windows开发的行业标准。VC应用程序创建过程。 VC+开发工具包含了两个完整的Windows应用程序开发系统。一个是只使用 Win32API函数来开发C+语言的Windows程序;另一个是使用MFC类库,在应用程序框架 范围内的C+编程。使用MFC类库编程接口也可以直接使用一些Win32函数。本文采用了 第二种方法进行应用程序开发。 1.1.1 VISUALC+集成开发环境简介 VC+能被成为可视化集成开发环境(IntegratedDevelopmentEnvironment,IDE)是由于 在VC+中能够执行如下的功能: 1自动生成不用编写代码的起始框架应用程序; 2通过不同的方

19、法查看项目文件; 3建立应用程序的可视界面(菜单和对话框); 4编译和链接; 5运行时调试应用程序。 下面介绍几个VC+中的重要组件: 1应用程序向导 (Appwizard) AppWizard是一个标准的C+源代码生成器。它通过一系列的对话框来提示用户输入 创建程序所需的信息。然后Appwizard生成一些文件,这些文件构成应用程序框架。由 Appw 4 -izard生成的程序是一个基本的Windows程序,它创建一个带有特性、类名和源代码文件 名的Windows应用程序框架,这只是一个基本框架代码扩展,用户应在此基础上完善自己 的内容。 2类向导(Classwizard) 类向导(Clas

20、swizard)是一个交互式工具,主要进行类代码的维护。用来建立新的类、 定制类、把消息映射成类成员函数,或则把控制框映射为类变量成员。在开发程序时, 可以用classwizard建立程序所需要的类,包括消息处理和消息映射例程(用于定位处理消 息的代码)。 3资源视图 (Resourceview) 资源视图 (Resourceview)包括了项目中所有的层次列表,用于编辑和管理应用程序中 用到的各种可视元素,包括:快捷键、对话框、图标、菜单、字符串和工具栏等。 4类视图(ClassView) 类视图(classview)用于显示项目所有的类信息,主要是定制现有的类和建立新的类, 并在每个类中,

21、显示了成员函数和成员变量,还可以完成添加、删除、定位的功能。 5文件视图(FileView) 文件视图(FileView)视图同ClassView非常相似,将项目中的所有文件(C+文件、头文 件、资源文件等)以视图的形式分类显示。在视图中可以显示和编辑源文件和头文件。 1.2 MATLAB 简介 MATLAB是由美国MathWorks公司推出的一个作为科学和工程计算而专门设计的高 级交互式软件包,它是一种高性能的用于工程计算的编程软件,它把科学计算、编程和 结果的可视化都集中在一个使用非常方便的环境中。MATLAB最早作为矩阵实验室 (MatrixLaboratory)用来提供与LINPACK

22、和EISPACK矩阵软件接口的,后来,逐渐发展成 为具有通用科学计算、图形交互系统和程序设计语言的国际公认最优秀科技应用软件之 一。其典型的应用范围包括:数学计算、算法推导、建模和仿真、数据分析和结果的可 视化、应用程序开发,包括图形用户界面的建立。 MATLAB语言与其它高级语言相比编程效率高,便于用户使用,扩充能力强,语句 语法简单,高效方便的矩阵和数组运算,方便的绘图功能。 1数学库和函数库 5 MATLAB提供了C/C+数学库,其中的C+数学库功能很强,使用它可以用类似 MATLAB的语法编写C+程序,十分方便。虽然速度上仍然比手工C/C+程序慢,但是由 此换来的高效的开发效率和可靠性

23、往往是值得的。另外mcc命令可以将.tri文件转化为C或 CPP文件,编译后可以脱离MATLAB运行,它们也是使用的C/C+数学库。 MATLAB数学库是专门为脱离MATLAB环境而开发的C程序库,MATLAB图形库可 以提供图形界面应用程序的支持。有了MATLAB数学库和MATLAB图形库,就可以把大 部分的.m文件写成的应用程序编译成可执行的exe程序,脱离MATLAB环境独立运行。当 然也可以将.m文件编译成.CPP文件,添加到VC+工程中,实现VC+和MATLAB的混合 编程,使应用程序同样可以脱离MATLAB环境独立运行,但不能利用MATLAB的图形句 柄能力。 2SIMULINK简

24、介 SIMULINK是一个可视化动态系统仿真环境。一方面,它是使MATLAB的扩展,保 留了所有MATLAB的函数和特性;另一方面,它又有可视化仿真和编程的特点。借助其可 视化的优点,使用SIMULNK可以分析非常复杂的控制系统。在SIMULINK环境下分析和 设计控制器,甚至不需要编制任何参数就可以得到希望的数据。在3.0版本,还添加了模 块优先权与整合、总线模块等新的功能,为SIMULINK的应用开辟了更加广阔的前景。 1.3 动态链接库技术 本文在VC+程序中调用了MATLAB函数库和图形库,以实现数据的显示和MATLAB 算法的调用。本节简单介绍动态链接库的相关内容。 动态链接库(DL

25、L)是包含共享函数库的二进制文件,可以被多个程序同时使用。建立 应用程序的可执行文件时,不必将动态链接库连接到应用程序中,而是在运动时动态装 载动态链接库,装载时动态链接库被映射到调用进程的地址空间中。动态链接库中定义 有两种函数:导出函数和内部函数,导出函数可以被其它的模块使用,而内部函数只能 在动态链接库内部使用。动态链接是指Windows把一个模块中的函数调用链接到库模块中 的实际函数上的过程。通常,动态链接发生在各种目标模块运行库文件创建Windows的 EXE文件时刻。在Windows中,动态链接库是作为一个独立的模块进行编译和加载的,在 应用程序执行时被动态链接。动态链接库提供了一

26、个进程调用的方法,因为这些函数不 是进程的可执行代码,函数的可执行代码存在于动态链接库中,其中包括一个或多个函 6 数而且这些函数直到进程使用时才编译链接并存在于内存中。例如,Windows的API函数 就使用了动态链接库的方法。当进程开始执行时或则当进程的一个线程调用动态链接库 中的函数时,动态链接库便加载到该进程上。当动态链接库加载到一个进程时,Windows 便把动态链接模块映射到进程的地址空间中,使动态链接库的可执行代码在该进程中有 效。而当动态链接库从进程中卸载时,动态链接库模块就收回进程地址空间中的映射。 与其它函数一样,一个动态链接库函数可以在进程的任何地方执行。 使用动态链接库

27、的优点大致有: 1同一个动态链接库可以被多个进程使用,只要在内存中放入它的一个副本即可, 所以动态链接库的使用节省了内存,减少了磁盘操作。 2动态链接库与调用者相对独立,更新后只要重新编译动态链接库即可,不应用于 电路系统的数据采集与控制系统实现研究影响调用者,不必重新链接调用者的各个程序。 3接口被定义后,就可以编写各种版本的动态链接库以实现不同的内部功能。 4可以作为进程之间共享数据的一种机制。 5动态链接库中的函数可以被使用不同语言编写的程序调用,只要在调用时遵循调 用规范即可。 VisualC+中的MFC类库支持的三种动态链接库的开发: 1动态链接MFC的Regular.DLL 静态链

28、接MFC的DLL是通过函数外部调用DLL文件,通过静态的分析得出文件的调 用 模型。 2动态链接MFC的Regular.DLL 动态链接MFC的Regular.DLL是内部使用MFC的DLL,DLL中的导出函数可以被MFC 和非MFC可执行程序调用。 3MFC扩展DLL MFC扩展DLL是从己有的MFC类派生新的可再用类的DLL。扩展DLL再建立时使用 的 MFC动态链接库。扩展DLL中的导出函数只能由动态链接MFC的应用程序调用。 7 第二章第二章 VC 调用调用 MATLAB 2.1 VC 下通过 MATLAB 引擎调用 MATLAB Matlab引擎(engine)指的是Matlab提供

29、的接口函数,通过这些接口函数,用户可以方 便地在VC中调用Matlab。Matlab引擎采用的时客户机/服务器计算模式。其实质是利用 ActiveX自动化和DDE技术,来实现VC与Matlab之间的动态数据交换。VC作为客户端负 责用户接口和提出数据请求;而Matlab则向客户端提供数据服务。VC客户端通过Matlab 引擎与Matlab服务器建立连接,从而实现动态通信。具体调用过程如图2.1所示。 图2.1 调用Matlab引擎流程图 利用MATLAB引擎具体实现算法如下: 1编译环境的配置。 在Matlab环境窗口运行mex setup,可以按照其提示逐步实现,最后要选择的编译器是 安装在

30、本机上的VC编译器。 2运行环境设置。 (1) 在VC平台上,通过菜单Tool/Options,进入Directories,在Show directories for栏 VC 客户端 MATLAB 引擎 MATLAB 工作区 MATLAB 服务器 8 中 选择includefiles,添加路径:Root matlab/extern/include和Root matlab/extern/include/cpp。 (2) 在Show directories for栏中选择library files,添加Root matlab/extern/lib/win32/mincro soft/msvc60。

31、 (3) 打开界面菜单project/settings/link,在其object/library modules栏目中加入库文件 libmx lib,libeng lib,libmat lib。 注意,上面的(1)和(2)只需设置一次,而(3)每个步骤需要重新设置。 本次的Root matlab即为C: Microsoft/Matlab60。 3通过engine调用Matlab。 先申明引擎指针Engine* ep,然后使用engopen函数打开引擎,最后用engclose函数关 闭引擎,当引擎打开后,就可以用engEvalString等一些函数调用Matlab相关运算。 2.1.1 在 V

32、C 下建一个基于对话框的应用程序 Matlab 引擎采用客户和服务器计算方式,在运用中,VC 的 C 语言或 C+语言的程序 作为前端客户机,它向 Matlab 引擎传递命令和数据信息,并从 Matlab 引擎接收数据信息, 它提供了下列几个函数:engOpen, engGetArray, engPutArray, engEvaString, engOutputBuffer ,engClose 与客户机进行交互。 下面例程是在 VC 下建一个基于对话框的应用程序,在对话框中设置一个 Button 控件 OnMatlabEngine,在对话框.cpp 文件中加入”engine.h”和“math.

33、h”头文件,下面给出部分程 序清单。 void CtestmatlabDlg:OnMatlabEngine() Engine *ep; mxArray* T=NULL,*result=NULL,*mFs=NULL,*mnfft= NULL; double datax1024; char buffer1024; for(int j=0;je: Matlabexterninclude*.def/machine:ix86/out:*.lib 来生成程序所需的静态连接库 libeng.lib 和 libmx.lib,将 libeng.lib 和 libmx.lib 所在的目录加 入 VC+ proje

34、ct/link/object/library modules 下即可。 经试验调出的图形如下: 2.2 VC 通过 MATLAB 库函数实现混合编程 MATLAB提供了C/C+数学库,其中的C+数学库功能很强,使用它可以用类似 11 MATLAB的语法编写C+程序,十分方便。虽然速度上仍然比手工C/C+程序慢,但是由 此换来的高效的开发效率和可靠性往往是值得的。另外mcc命令可以将M文件转化为C或 CPP文件,编译后可以脱离MATLAB运行,它们也是使用的C/C+数学库。MATLAB数学 库是专门为脱离MATLAB环境而开发的C/C+程序库,MATLAB图形库可以提供图形界 面应用程序的支持。

35、MATLAB数学库和MATLAB图形库,就可以把大部分的.m文件写成 的应用程序编译成可执行的exe程序,脱离MATLAB环境独立运行了,当然也可以将.m文 件编译成C+程序,添加到VC的工程中,实现VC和MATLAB的混合编程,使应用程序同 样可以脱离MATLAB环境独立运行的。 图2.2展示了如何在VC中利用MATLAB数学库和图形库开发独立运行应用 图2.2 在VC中利用MALAB开发独立运行的应用程序流程图 1编写MATLAB的.m函数文件 原函数文件.test.m,该函数生成一个正弦函数的信号,并对一维信号进行余弦变换, 得到其变换系数,最后以将信号和变换系数在图形窗口中显示。函数的

36、入口参数n为产生 离散正弦函数信号的采样点数。 在 Matlab 下编写.m 文件 利用 mcc 编译.m 文件生成相应的.cpp,.hpp 文 件 在 VC 工程中插入.cpp,.hpp 文件 在工程中进行 matlab 图形库和数学库的初始 化设置和关闭 编写调用 matlab 功能函数的程序 在 VC 中进行编译环境设置 编译,连接,运行 12 function test ( n ) if isstr ( n ) n = str2num ( n ) ; end signal = sin ( 1: n /n*(16* pi) ) ; %产生一个正弦函数的信号signal subplot (

37、211) ; plot ( signal) ; coff_dct = dct ( signal) ; %对信号signal进行DCT变换,得变换系数 subplot (212) ; plot ( coff_dct) ; 2利用mcc编译.m文件 在MATLAB利用mcc编译test.m函数文件,产生test.cpp,subplot.cpp,dct.cpp,test.hpp, subplot1hpp,dct1hpp等文件。编译命令为mcc2B、sglcpp、test参数“-Bsglcpp”含义是将.m文 件编译成为C+代码,提供图形库支持,并编译为独立运行的exe程序。 3在工程中插入.cpp,

38、.hpp文件 利用MFCWizard(exe)建立一个名为SglMFC的工程。将上面生成的test.cpp,subplot.cpp, dct.cpp,test.hpp,subplot.hpp,dct.hpp文件移到SglMFC工程目录下,并分别插入到该工程中, 若产生了其它的.cpp,.hpp也应同理插入到工程中。 4在工程中进行MATLAB数学库和函数库的初始化设置和关闭 在CmainFrame的构造函数进行Matlab数学库和图形库的初始化设置,在析构函数中 进行C+函数库和图形库的关闭设置,在MainFrame.cpp文件中包含三个头文件。 #include“stdafx. h” #in

39、clude“matlab. hpp” #include“test. hpp” / / test是利用mcc生成的文件 CmainFrame: : CmainFrame ( ) libmmfile Initialize ( ) ; / /初始化Matlab数学库 libmwsglm Initialize ( ) ; / /初始化Matlab图形库 mlfHGInitialize (NULL,NULL) ; CmainFrame: : CmainFrame ( ) mlfHGWaitForFiguresToDie ( ) ; 13 mlfHGTerminate ( ) ; libmmfileTer

40、minate ( ) ; / /关闭Matlab数学库 libmwsglmTerminate ( ) ; / /关闭Matlab图形库 5编写调用MATLAB功能函数的程序 在工程中插入一个顶层菜单SHOW,在该菜单下插入一个下拉式菜单项CallMatalb, 并指定其ID为ID _SHOW _CALLMATLAB。利用ClassWizard生成该菜单的消息处理函数: void CmainFrame: :OnShowCallmatlab ( ) mwArray n; / /定义mwArray变量n,作为参数传递给函数test n = 64; test ( n) ; / /调用test函数 6在

41、VC中进行编译环境设置 (1)选择菜单Tools Options,选择Directories属性页,添加头文件搜索路径和库文件搜 索路径,本文的头文件搜索路径和库文件搜索路径如下: F:matlab62 extern include F:matlab62 extern include cpp F:matlab62 extern lib win32 F:matlab62 extern lib win32 microsoftmsvc60 (2) 选择菜单Project,Settings,打开工程设置对话框,在C/C+属性页中选择Category 为General,在Preprocessordefi

42、nitions编辑框添加三个字符串MSVC,IBMPC,MSWIND。 (3) 在C/C+属性页内,在Category为PrecompiledHeaders选择Automaticuse of precom -piledheaders,在Throughheader编辑框中,输入stdafxh。 (4) 在C/C+属性页内,选择Category为CodeGeneration,在Use run - time library列表 框中,选择DebugMultithreaded DLL。 (5) 在Link属性页中,选择Category为Input,在Object/ library modules编辑框

43、,添加如 下的7个库文件:libmmfile. lib, libmatlb. lib,libmx. lib, libmat. lib,libmatpm. lib sgl.lib,libmw. sglm. lib。 14 7在VC环境中编译,连接,运行。 2.2.1 C 语言实现 M 文件的方法 在 MATLAB 当中,利用 M 文件来实现函数,每一个 M 文件实现一个单独的功能, 和 C 语言当中的函数是相互对应的。所以,将 MATLAB 中的 M 文件转化为 C 语言下的 一个单个函数,能实现 MATLAB 中相应的功能。 实现方法: 整个过程可分为三个主要部分,用 MATLAB 将 M 文

44、件翻译为 C 语言文件,从生成 的 C 语言文件提取出有用语句,编写数据转换程序实现参数格式转换。整个过程最终将 把 M 文件翻译成 C 语言当中的一个具有相同功能的函数,供其它的程序调用。 (1)将 M 文件编译为 C 语言文件 为了将 M 文件翻译为 C 语言文件,需要进行一定的设置,这里假设编写 C 语言的环 境为 VC6.0,在 MATLAB 命令提示符下输入 mex -setup 和 mbuild -setup 命令,在相应选 项中选择 MicrosoftVisualC/C+即可。 在 MATLAB 命令行中使用 mcc 命令将 messay.m 翻译为 C 代码。 mcc-m me

45、ssay.m。其中的参数-m 代表 mcc 命令将把 m 文件翻译成 C 语言的代码。 翻译命令将在 messay.m 所在的文件夹下生成三个 C 语言文件:messay.h,messay.c 和 messay_main.c。其中 messay_main.c 提供了 main()函数;messay.h 提供了整个程序的函 数声明;messay.c 包含了 MATLAB 生成的功能函数。这三个文件当中,messay.c 中包含 了所需要的数学函数。 (2)提取有用语句 由 mcc 生成的代码内部参数传送方式由 MATLAB 链接库规定,难以改动,需要提取 有用的代码,并更改生成代码的参数传递方式

46、。同时从生成代码的注释中可以看出,真 正蕴含 M 文件功能实现的代码段都在 Mmessay()函数当中(该函数名的默认构造方式为 前缀 M 加上 M 文件的文件名),而其它的生成函数仅实现参数传递和标准化接口服务的 功能。 15 所以提取代码的具体方法是利用 messay.c 当中生成的 static mxArray * Mmessay(int nargout_)函数,对该函数进行修改,而其他的生成函数都可以忽略不用。原生成的 Mmessay()代码如下: static mxArray*Mmssay(int nargout) mexLocalFunctionTable save_local_f

47、unction_table= mclSetCurrentLocalFunctionTable( mxArray*c=NULL; mxArray*b=NULL; mxArray*a=NULL; mlfAssign( mlfAssign( mlfAssign( mclValidateOutput(c,1,nargout_,”c”,”messay”); mxDestroyArray(a); mxDestroyArray(b); mclSetCurrentLocalFunctionTable(save_local_function_table_); return c; 在生成代码当 mclSetCur

48、rentLocalFunctionTabmclSetCurrentLocalFunctionTable 函数为 两个外部函数,将参数传给外部,与其相关的部分都对 C 程序使用数学函数没有影响。 最终实际有用并执行运算的只有一句: mlfAssign(/三个用于 MATLAB 数学函数计算的参数 double *outc;/计算结果变量 a=mlfScalar(double)ina);/利用 mlfScalar()进行类型转换 b=mlfScalar(double)inb); mlfAssign( outc=mxGetPr(c);/获得结果的实部,即结果 mxDestroyArray(a);/释

49、放空间 mxDestroyArray(b); mxDestroyArray(c); return*outc; 到此,整个翻译过程完成,但是不能直接调用。在这个函数当中运用到了 MATLAB 的数学库函数 mlfSqrt()、mlcPlus()和数据转换函数 mlfScalar()、mxGetPr()。由于这些函 数是固化在链接库当中的,为了连接执行,必须加入几个库文件和几个静态链接库 lib 文 件。所需要的库文件为 mcc 命令生成的 messay.c 文件当中所加入的库文件,一般为 libmatlb.h,而需要加入的静态链接库文件如下: libmat.lib.libmatlb.lib,libmex.lib,libmx.lib 如果没有以上文件,可以用 VC 的 lib

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1