




已阅读5页,还剩33页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
anyang institute of technology 本本 科科 毕毕 业业 论论 文文 matlab 与与 vc 交互的研究与实现交互的研究与实现 reserching and realization of matlab and vc interaction 系(院)名称: 电子信息与电气工程学院 专业班级: 04 级自动化 1 班 学生姓名: 指导教师姓名: 指导教师职称: 讲 师 2008 年 05 月 - i - matlab 与与 vc 交互交互的研究与实现的研究与实现 专业班级:04 级自动化 1 班 学生姓名: 指导教师: 职 称: 讲 师 摘要摘要:本文研究并实现了matlab与vc+的交互方法。该方案能充分利用matlab丰 富的控制算法、强大的数据处理功能和vc+方便、快捷、灵活的特点。作为世界顶尖的 数学应用软件,以其强大的工程计算、算法研究、工程绘图、应用程序开发、数据分析 和动态仿真等功能,在各个领域发挥着越来越重要的作用。而vc+语言功能丰富、使用 灵活方便,目标程序效率高。其既有高级语言的优点,又有低级语言的特点。在vc+6.0 中,可以方便、快捷的生成所需的dll(动态链接库)项目, dll项目具有很强的通用 性和实用性,并且代码的运行效率高,具有开发周期短、软件容易维护等诸多优点,是 一种很好的编程方法。 本文充分利用vc+和matlab的各自优势,在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 mcc;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 characteristic. 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 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 dll 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, 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 and 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+ procedure 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 简介.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 3.3 c 语言程序 mex 文件实例28 结论结论31 致谢致谢32 参考文献参考文献33 1 引引 言言 matlab是mathworks公司于1982年推出的一套高性能的数值计算和可视化软件。它集 数值分析、矩阵运算、信号处理图形显示甚至符号运算功能于一体,构成了一个方便、 界面友好的用户环境。它还包括了有各个领域专家相继推出的工具箱,借助于这些“巨人 肩上的工具”,各个层次的研究人员可直观、方便地进行分析、计算及设计工作,从而 大大地节省时间。matlab具有可扩展性、易学易用性、高效性等特点。 然而 matlab 自身所存在的某些缺点限制了它的应用范围。(1)matlab 以解释方式执行 效率很低,这在处理图像是特别明显;(2)matlab 程序不能脱离其环境运行,因此它不能 被用于开发商用软件;(3)matlab 的程序是后缀为 m 的脚本文件它代码的完整性和安全性, 并不希望用户了解或更改核心程序;(4)其界面编写功能也过于简单,以致不能满足用户 的高级需求。 实际应用中,任何一个软件平台都不是万能的,matlab 软件平台就缺少直接操作 计算机硬件相关的命令与函数。对一些既要应用 matlab 软件平台独特功能,又要直接 操作计算机硬件,尤其是涉及到数据采集与输出控制的应用场合带来一定的不便。 visualc+已成为windows系统平台上最强大的应用程序开发系统,因为visualc+开 发的程序文件小,执行速度快、实时性好,已成为操作系统、设备驱动程序和系统级平台 类软件的最佳开发工具。matlab由于其绘图功能强大,较之vc其语言更为简洁明了,并 且生成的图形可轻松实现多种功能,诸如图形添加文字说明、缩放、旋转、坐标轴标注、 曲线说明等等,这些若由vc来实现将极为复杂。因此如果把matlab的程序加入到自己的 visualc+程序中,将大大减少编程的工作量、保证程序的准确性,并且继承这些可视化变 成工具良好的用户界面。对于很多的工程项目特别是在数值化计算程度高的应用程序开 发中,通过二者的混合编程,即采用vc+完成框架定制和界面开发,利用matlab强大的矩阵 计算和操纵以及数值分析功能,完成核心数值计算和算法设计,实现应用程序的快速开 发,而且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)生成的 程序则没有这样的要求,它能够以独立执行程序的形式运行,即使在客户没有安装matlab 2 系统下。用方式(4)生成的代码可读性好,支持图形函数,支持m文件编译过程中的文件 嵌套情况,可脱离matlab环境,其缺陷为待编译的m文件不能涉及matlab的内部类。方式 (3)唯一的缺点就是不能利用matlab中丰富的图形句柄处理函数,但是对于visual c+等开 发工具而言,这不是一个很严重的问题。因此方式(3)是实现功能和效率兼顾的最好接口 方法。 本文将详细介绍vc+和matlab的交互的实现方法并进行简单的比较。 3 第一章第一章 vc 和和 matlab 介绍介绍 1.1 vc 开发软件简介 二十世纪九十年代以来,伴随着计算机硬件技术的高速发展,windows操作系统形成 了垄断地位。windows应用软件也蓬勃发展,广泛应用与各个行业,包括科研和生产制造 业。 对于windows应用软件的开发,微软公司业提供了强大、复杂的开发工具 vsualc+(以后简称vc+),借助其生成代码的向导,能快速生成可运行的windows应用 程序外壳框架。vc+附带的基本类库,即mfc(microsoft foundation classes)不同于从前 进行windows开发所用的api函数 (applieation programming interface),已经成为许多c+ 编译器进行windows开发的行业标准。vc应用程序创建过程。 vc+开发工具包含了两个完整的windows应用程序开发系统。一个是只使用 win32api函数来开发c+语言的windows程序;另一个是使用mfc类库,在应用程序框架 范围内的c+编程。使用mfc类库编程接口也可以直接使用一些win32函数。本文采用了 第二种方法进行应用程序开发。 1.1.1 visualc+集成开发环境简介 vc+能被成为可视化集成开发环境(integrateddevelopmentenvironment,ide)是由于 在vc+中能够执行如下的功能: 1自动生成不用编写代码的起始框架应用程序; 2通过不同的方法查看项目文件; 3建立应用程序的可视界面(菜单和对话框); 4编译和链接; 5运行时调试应用程序。 下面介绍几个vc+中的重要组件: 1应用程序向导 (appwizard) appwizard是一个标准的c+源代码生成器。它通过一系列的对话框来提示用户输入 创建程序所需的信息。然后appwizard生成一些文件,这些文件构成应用程序框架。由 appw 4 -izard生成的程序是一个基本的windows程序,它创建一个带有特性、类名和源代码文件 名的windows应用程序框架,这只是一个基本框架代码扩展,用户应在此基础上完善自己 的内容。 2类向导(classwizard) 类向导(classwizard)是一个交互式工具,主要进行类代码的维护。用来建立新的类、 定制类、把消息映射成类成员函数,或则把控制框映射为类变量成员。在开发程序时, 可以用classwizard建立程序所需要的类,包括消息处理和消息映射例程(用于定位处理消 息的代码)。 3资源视图 (resourceview) 资源视图 (resourceview)包括了项目中所有的层次列表,用于编辑和管理应用程序中 用到的各种可视元素,包括:快捷键、对话框、图标、菜单、字符串和工具栏等。 4类视图(classview) 类视图(classview)用于显示项目所有的类信息,主要是定制现有的类和建立新的类, 并在每个类中,显示了成员函数和成员变量,还可以完成添加、删除、定位的功能。 5文件视图(fileview) 文件视图(fileview)视图同classview非常相似,将项目中的所有文件(c+文件、头文 件、资源文件等)以视图的形式分类显示。在视图中可以显示和编辑源文件和头文件。 1.2 matlab 简介 matlab是由美国mathworks公司推出的一个作为科学和工程计算而专门设计的高 级交互式软件包,它是一种高性能的用于工程计算的编程软件,它把科学计算、编程和 结果的可视化都集中在一个使用非常方便的环境中。matlab最早作为矩阵实验室 (matrixlaboratory)用来提供与linpack和eispack矩阵软件接口的,后来,逐渐发展成 为具有通用科学计算、图形交互系统和程序设计语言的国际公认最优秀科技应用软件之 一。其典型的应用范围包括:数学计算、算法推导、建模和仿真、数据分析和结果的可 视化、应用程序开发,包括图形用户界面的建立。 matlab语言与其它高级语言相比编程效率高,便于用户使用,扩充能力强,语句 语法简单,高效方便的矩阵和数组运算,方便的绘图功能。 1数学库和函数库 5 matlab提供了c/c+数学库,其中的c+数学库功能很强,使用它可以用类似 matlab的语法编写c+程序,十分方便。虽然速度上仍然比手工c/c+程序慢,但是由 此换来的高效的开发效率和可靠性往往是值得的。另外mcc命令可以将.tri文件转化为c或 cpp文件,编译后可以脱离matlab运行,它们也是使用的c/c+数学库。 matlab数学库是专门为脱离matlab环境而开发的c程序库,matlab图形库可 以提供图形界面应用程序的支持。有了matlab数学库和matlab图形库,就可以把大 部分的.m文件写成的应用程序编译成可执行的exe程序,脱离matlab环境独立运行。当 然也可以将.m文件编译成.cpp文件,添加到vc+工程中,实现vc+和matlab的混合 编程,使应用程序同样可以脱离matlab环境独立运行,但不能利用matlab的图形句 柄能力。 2simulink简介 simulink是一个可视化动态系统仿真环境。一方面,它是使matlab的扩展,保 留了所有matlab的函数和特性;另一方面,它又有可视化仿真和编程的特点。借助其可 视化的优点,使用simulnk可以分析非常复杂的控制系统。在simulink环境下分析和 设计控制器,甚至不需要编制任何参数就可以得到希望的数据。在3.0版本,还添加了模 块优先权与整合、总线模块等新的功能,为simulink的应用开辟了更加广阔的前景。 1.3 动态链接库技术 本文在vc+程序中调用了matlab函数库和图形库,以实现数据的显示和matlab 算法的调用。本节简单介绍动态链接库的相关内容。 动态链接库(dll)是包含共享函数库的二进制文件,可以被多个程序同时使用。建立 应用程序的可执行文件时,不必将动态链接库连接到应用程序中,而是在运动时动态装 载动态链接库,装载时动态链接库被映射到调用进程的地址空间中。动态链接库中定义 有两种函数:导出函数和内部函数,导出函数可以被其它的模块使用,而内部函数只能 在动态链接库内部使用。动态链接是指windows把一个模块中的函数调用链接到库模块中 的实际函数上的过程。通常,动态链接发生在各种目标模块运行库文件创建windows的 exe文件时刻。在windows中,动态链接库是作为一个独立的模块进行编译和加载的,在 应用程序执行时被动态链接。动态链接库提供了一个进程调用的方法,因为这些函数不 是进程的可执行代码,函数的可执行代码存在于动态链接库中,其中包括一个或多个函 6 数而且这些函数直到进程使用时才编译链接并存在于内存中。例如,windows的api函数 就使用了动态链接库的方法。当进程开始执行时或则当进程的一个线程调用动态链接库 中的函数时,动态链接库便加载到该进程上。当动态链接库加载到一个进程时,windows 便把动态链接模块映射到进程的地址空间中,使动态链接库的可执行代码在该进程中有 效。而当动态链接库从进程中卸载时,动态链接库模块就收回进程地址空间中的映射。 与其它函数一样,一个动态链接库函数可以在进程的任何地方执行。 使用动态链接库的优点大致有: 1同一个动态链接库可以被多个进程使用,只要在内存中放入它的一个副本即可, 所以动态链接库的使用节省了内存,减少了磁盘操作。 2动态链接库与调用者相对独立,更新后只要重新编译动态链接库即可,不应用于 电路系统的数据采集与控制系统实现研究影响调用者,不必重新链接调用者的各个程序。 3接口被定义后,就可以编写各种版本的动态链接库以实现不同的内部功能。 4可以作为进程之间共享数据的一种机制。 5动态链接库中的函数可以被使用不同语言编写的程序调用,只要在调用时遵循调 用规范即可。 visualc+中的mfc类库支持的三种动态链接库的开发: 1动态链接mfc的regular.dll 静态链接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提供的接口函数,通过这些接口函数,用户可以方 便地在vc中调用matlab。matlab引擎采用的时客户机/服务器计算模式。其实质是利用 activex自动化和dde技术,来实现vc与matlab之间的动态数据交换。vc作为客户端负 责用户接口和提出数据请求;而matlab则向客户端提供数据服务。vc客户端通过matlab 引擎与matlab服务器建立连接,从而实现动态通信。具体调用过程如图2.1所示。 图2.1 调用matlab引擎流程图 利用matlab引擎具体实现算法如下: 1编译环境的配置。 在matlab环境窗口运行mex setup,可以按照其提示逐步实现,最后要选择的编译器是 安装在本机上的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。 (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 在 vc 下建一个基于对话框的应用程序 matlab 引擎采用客户和服务器计算方式,在运用中,vc 的 c 语言或 c+语言的程序 作为前端客户机,它向 matlab 引擎传递命令和数据信息,并从 matlab 引擎接收数据信息, 它提供了下列几个函数:engopen, enggetarray, engputarray, engevastring, engoutputbuffer ,engclose 与客户机进行交互。 下面例程是在 vc 下建一个基于对话框的应用程序,在对话框中设置一个 button 控件 onmatlabengine,在对话框.cpp 文件中加入”engine.h”和“math.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+ project/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图形库可以提供图形界 面应用程序的支持。matlab数学库和matlab图形库,就可以把大部分的.m文件写成 的应用程序编译成可执行的exe程序,脱离matlab环境独立运行了,当然也可以将.m文 件编译成c+程序,添加到vc的工程中,实现vc和matlab的混合编程,使应用程序同 样可以脱离matlab环境独立运行的。 图2.2展示了如何在vc中利用matlab数学库和图形库开发独立运行应用 图2.2 在vc中利用malab开发独立运行的应用程序流程图 1编写matlab的.m函数文件 原函数文件.test.m,该函数生成一个正弦函数的信号,并对一维信号进行余弦变换, 得到其变换系数,最后以将信号和变换系数在图形窗口中显示。函数的入口参数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 (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,.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” #include“matlab. hpp” #include“test. hpp” / / test是利用mcc生成的文件 cmainframe: : cmainframe ( ) libmmfile initialize ( ) ; / /初始化matlab数学库 libmwsglm initialize ( ) ; / /初始化matlab图形库 mlfhginitialize (null,null) ; cmainframe: : cmainframe ( ) mlfhgwaitforfigurestodie ( ) ; 13 mlfhgterminate ( ) ; libmmfileterminate ( ) ; / /关闭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在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,在preprocessordefinitions编辑框添加三个字符串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编辑框,添加如 下的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 文件翻译为 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 messay.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 链接库规定,难以改动,需要提取 有用的代码,并更改生成代码的参数传递方式。同时从生成代码的注释中可以看出,真 正蕴含 m 文件功能实现的代码段都在 mmessay()函数当中(该函数名的默认构造方式为 前缀 m 加上 m 文件的文件名),而其它的生成函数仅实现参数传递和标准化接口服务的 功能。 15 所以提取代码的具体方法是利用 messay.c 当中生成的 static mxarray * mmessay(int nargout_)函数,对该函数进行修改,而其他的生成函数都可以忽略不用。原生成的 mmessay()代码如下: static mxarray*mmssay(int nargout) mexlocalfunctiontable save_local_function_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; 在生成代码当 mclsetcurrentlocalfunctiontabmclsetcurrentlocalfunctiontable 函数为 两个外部函数,将参数传给外部,与其相关的部分都对 c 程序使用数学函数没有影响。 最终实际有用并执行运算的只有一句: mlfassign(/三个用于 matlab 数学函数计算的参数 double *outc;/计算结果变量 a=mlfscalar(double)ina);/利用 mlfscalar()进行类型转换 b=mlfscalar(double)inb); mlfassign( outc=mxgetpr(c);/获得结果的实部,即结果 mxdestroyarray(a);/释放空间 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 命令将 matlab 相应的 def 文件转化为 lib 文 件,转化格式为 lib /def:filename.def /machine:ix86 /out:filename.lib。 17 2.2.2 库函数的使用制约 使用本文所用的方法可以将 m 文件翻译为 c 语言的函数,但是要受到两个因素的制 约 1功能的实现受到 matlab c 函数库的限制 这种翻译的机制是由 matlab 提供的,mcc 命令能直接翻译的函数也仅局限于 matlab 原有的函数。因为这些函数已经被 matlab6.5 编译好,一般以 mlf 为前缀, 存于动态链接库当中并可被 c 语言直接调用。而超出了这个范围的函数,并在 m 文件当 中被嵌套使用,在用 mcc 进行翻译的时候,mcc 将在函数名前加上前缀 mlf,并进一步翻 译该函数。 但是,这种翻译受到 matlab 参数传递的限制,而不能直接调用,在编译时会出现 找不到相应的外部函数的错误。解决办法是手动将所有被翻译的函数进行参数传递方式 的调整。如果 m 文件当中包含的函数被嵌套翻译的层数很深,这样的工作量是巨大的。 同时很多工具箱当中定义的函数也是不能使用这种方法进行翻译的。matlab 的工 具箱更新速度很快,而相应的 matlab c 的函数库有一定滞后,导致很多最新的工具箱 当中的函数是不能被翻译的。 2翻译本身存在的限制 因为这种翻译是遵守 c 语言要求的,因而对于内存分配要求和 c 语言不同的函数和 一些关于图形显示类型的函数(包括大量的 gui 相关函数)也不能被正确的翻译。例如 mash.m 和 step.m 这两个较常用的 matlab 函数,由于上述的限制,就不能用本方法进 行翻译。 对于上述的问题,可以利用在 c 程序当中运用 matlab 引擎的方法动态调用 matlab 的库函数,基本上可以解决上述所有的函数不能被正确翻译和图形显示的问题。 但是,运用 matlab 引擎的方法需要利用 activex 的自动化服务器,在运行的时候程序 会在后台执行一个 matlab 的线程而不能完全脱离 matlab 的环境,也就意味着在纯 c 的环境下是不能运用的,必须要先安装 matlab 并能够在运行时支持多线程工作。 2.3 用 matcom(mideva)进行翻译 matcom 提供了 matlab 中. m 文件与其他高级语言的接口 ,使 m 文件可以编译为脱离 18 matlab 环境独立执行的可执行性程序 ,提高了代码的复用率和代码的执行速度。使纯文 本的.m 文件变为二进制的可执行程序 ,增加了知识保护的安全性。同时它提供了近千个 数学函数 ,对于其他高级语言编译器来说 ,提供了一个丰富 matlab 的数学库 ,基本上在 matlab 上能用的常用函数都可以在高级语言中直接调用。流程见图 2.3 图 2.3 用 mideva 翻译流程图 假如主程序(c+编写),需要 10 个 random 的数字,并将 random 产生的数字用图形 表示出来,假设已经写好了一个 matlab 程序:runrand.m,其内容如下所示。 matcom(mideva)翻译 m 文件源程序示例 runrand.m g runrand runrand.cpp function runrand # include“matlib.h” # include“matlib.h” a = rand(10 ,1) ; #pragma hdrstop #pragma hdrstop display(a) ; # include“runrand.h” # include“runrand.h” plot(a) ; int main() mm runrand() begin scope begin scope initm(matcom version) ; / dmm(a) ; runrand.h runrand() ; call stack begin; / 这里可看成运行 matlab 库所使用 / 省略部分程序 # ifndef runrand h exitm() ; / translated code # define runrand h printf(“我们所加入的测试码进行测试”) ; a = rand(10.0 ,1.0) ; mm runrand() ; return 0; display(a) ; # endif / runrand h end scope plot(cl(a) ; call stack end; m 文件 matcomvc c+文件 已编译的数学函数 matlab b 19 return x m; end scope 那么在 matlab 的 command window 下输入 matcom runrand 之后,将得到 runrand.exe 和其他的 cpp files 以及 headfile 等。可以点选 runrand.exe,就可以看出此效果了。可以修 改参数不立即生成 exe 文件。使用 matcom runrand-trans 表示,只转换为 c+source code,不会再自动帮助编译为 exe 或 mexfile 如 dll 文件等,以下以 vc+6.0 为工具进行 调用。 1经由上式,得到两个 c+代码,分别是 grunrand.cpp 和 runrand.cpp,开启 vc6.0 后,选 file-new-projects-win32 console application,之后选 anempty project。然后点 选 fileview,在其 source files 加入上述的两个 cpp 文件 grunrand.cpp 其实就是主程序, 而 runrand.cpp 是其子程序,这两个文件都要包含 include“matlib. h”和“runrand.h”。而 matlib.h 的位置在 d:matcom45lib 里。 2设置。在 fileview 中选取 project 的名称,选择 setting-c/c+-category 种类 preprocessor,然后在其下面 additional include directories 填入 d:matcom45lib 就可以了。 3由于 matcom 的 matlab 库定义在 v450v.lib 文件里,在 fileview 中选取 project 的 名称按右键,选 addfilesto project,将 d: matcom451libv4510v.lib 这个文件加入即可。 至此便完成了整个程序,倘若在 grunrand.cpp 加入一行做测试。此时运行 vc+ 6.0 执行就可以看到测试效果了。注意由此做出来的执行文件也不具有独立运行的能力,因 为它仍需要 matlab library,所以仅供程序发展中的测试。 20 第三章第三章 matlab 平台下调用平台下调用 vc matlab 中调用 c 语言程序,必须通过 me
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 设计用人聘用协议书
- 员工股权授予协议书
- 在先权利确认协议书
- 进入泰安报备协议书
- 医院投资项目协议书
- 政务棋牌转让协议书
- 外聘兼职电工协议书
- 冷库出租协议书范本
- 医院器械消毒协议书
- 家具代购协议书范本
- 12万吨年丁二烯抽提装置、10-3万吨年MTBE-丁烯-1装置总承包工程施工组织设计
- 骨盆骨折治疗新进展
- 防范电信诈骗安全教育共建平安校园宣传课件
- DFMEA-磷酸铁锂电池案例
- GB/T 44625-2024动态响应同步调相机技术要求
- 网络销售食品监督抽检抽样指南
- 第七届江西省大学生金相技能大赛知识竞赛单选题题库附有答案
- 中医内科学全套课件
- 07J912-1变配电所建筑构造
- 沈阳市南昌初级中学2023-2024学年七年级下学期3月月考数学试题
- 2022-2023学年江苏省扬州市江都区仙女镇中心小学苏教版六年级下册期中测试数学试卷
评论
0/150
提交评论