ImageVerifierCode 换一换
格式:DOCX , 页数:12 ,大小:25.37KB ,
资源ID:6217737      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/6217737.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(Matlab与VC混合编程的实现方法.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

Matlab与VC混合编程的实现方法.docx

1、Matlab与VC混合编程的实现方法vc调用matlab函数2008-12-24 10:20Matlab 是由Math Works 公司于1984 年推出的数值计算及图形处理软件,可以实现数值分析、优化、统计、偏微分方程数值解、自动控制、信号处理、图像处理等若干领域的计算和图形显示功能。其中,控制系统工具箱的集成为设计和分析各种复杂的控制系统提供了有效的方法和途径。但是,由于Matlab开发平台的局限性,在其上面开发的程序不能脱离Matlab运行环境,因而在处理一些实际应用问题时显得灵活性不足,而VC+则在一定程度上能够弥补这一漏洞,因此,现将二者结合共用,各献其长,可以为科研工作和工程开发提

2、供了更为强大的技术支持。1、Matlab与VC混合编程的实现方法Matlab作为控制系统设计的一种通用工具,它可以和VC方便的进行连接。一般而言,Matlab与VC混合编程的实现方法主要有以下三种方法:(1)通过引擎(Engine),采用客户机服务器的计算模式,通过Window的ActiveX通道和Matlab进行连接。具体应用时,往往在VC中设计程序框架,以编译的程序作为前端客户机;通过调用Matlab引擎在后台实现与服务器的连接,实现动态通信(2)应用Matlab数学函数库,Matlab中包含了内容丰富的函数库,而且还提供了与VC的数学函数接口,用户可以方便的在VC的IDE(集成开发环境)

3、中调用。(3)通过DLL实现VC与Matlab的混合编程。DLL是一个可执行的二进制文件。把很多通用的功能放在DLL中,可以供多个应用程序调用,这样可以很好的减少外部存储空间的占有量,并实现代码的共享2。在上述三种方法中,第一种方法对调用Matlab的工具箱很实用,所有在进行控制系统的设计和分析时,一般都是通过调用Matlab引擎(Engine)来实现的。本文主要介绍采用通过引擎(Engine)来实现VC与Matlab的混合编程。2、MATLAB引擎简介Matlab引擎是Matlab提供的一系列程序的结合,它允许用户在自己的应用程序中对Matlab进行调用,将Matlab作为一个操作引擎使用,

4、使其在后台运行。一般Matlab 引擎采用客户机/ 服务器(Client/ Sever) 计算方式,就是一种把应用处理负载分布到客户机和服务器上的一种计算模式,客户机和服务器既可以是存在于同一台计算机,也可以通过网络来实现信息共享。一般情况下,客户机是运行前端软件的PC机,并且知道如何与服务器通信,服务器与此相对应,是接收请求信息,并采取相应行的机器。由于客户机和服务器共同承担处理负载,使系统总体性能大为提高。在实际应用过程中,把VC的C语言或C + + 语言的程序作为前端客户机程序,它从Matlab 引擎接收数据信息,并与引擎传递命令的数据信息。表1是几种常用的Matlab引擎调用函数。表1

5、 Matlab引擎常用调用函数通过Matlab引擎用户可以完成以下任务:首先,可以将Matlab作为一个功能强大的和可编程的数学函数库,调用Matlab中的大量的数学计算函数,完成复杂的计算任务;其次,可以为一个特定的任务构建一个完整的系统,前台的用户界面用高级语言编写,后台的计算任务由Matlab引擎来完成;最后,用户不但可以在本地计算机上调用Matlab引擎,而且还可以通过网络调用其它计算机上的Matlab引擎,这样可以很好的实现资源的共享和作业的分工合作。3、Matlab引擎实现VC和Matlab混合编程的步骤要想在VC集成环境下利用Matlab引擎实现VC和Matlab的混合编程,一般

6、需要经过以下几个必要的步骤:(1)Visual C+6.0 编译环境的设置:通过菜单 Tools/ Options,打开Visual C+6.0设置属性页,进入 Directorie页面,在 Show Directories for下拉列表中选择Include Files,添加路径:D:Matlab6p5externinclude(在Matlab的安装路径下);再选择下拉列表中的 Library Files,添加路径:D:Matlab6p5extern libwin32Microsoftmsvc60(在Matlab的安装路径下)。编译环境只需设置一次。(2)添加库文件: 通过菜单 Projec

7、ts|settings,进入 Link 页面,在 Object/Library Modules 框中,添加库文件名:libmx.lib 、libmat.lib 、libeng.lib。每个新的工程文件都要单独添加库文件。(3)在使用 engine 函数的程序头文件中包含如下两个头文件:#include engine.h#include (4)在应用程序中添加调用Matlab引擎的程序代码: Engine *ep;if(!(ep=engOpen( 0) /打开Matlab引擎,建立与本地Matlab的连接fprintf(stderr,n Cant start MATLAB enginen);ex

8、it(-1);以上步骤是对VC与Matlab混合编程的编译环境进行设置,在完成了以上基本步骤后就可以利用Matlab引擎库函数engEvalString来调用Matlab的内建函数了。根据上面的方法,下面通过一个具体的实力来说明如何实现VC与Matlab混合编程、它们之间的数据通信以及VC环境下对Matlab命令的调用。首先,利用VC+6.0的MFC建立一个单文档结构的应用程序,加入一个菜单资源,为其映射相应的功能函数;其次,根据Matlab引擎实现VC和Matlab的混合编程步骤(见第三部分)为程序设置相应的编译环境并添加连接库函数;然后,调用Matlab的内建函数和命令,主要编写程序代码如

9、下:static double Areal6=1,2,3,4,5,6;mxArray *T=NULL,*a=NULL,*d=NULL;double time10=0,1,2,3,4,5,6,7,8,9;/*利用mx函数库创建矩阵,传递参数。*/T=mxCreateDoubleMatrix(1,10,mxREAL);memcpy(char*)mxGetPr(T),(char*)time,10*sizeof(double);/*通过上面创建的Matlab Engine连接句柄将参数传递给Server端*/engPutVariable(ep,T,T);/*调用Matlab内建的函数和指令*/engE

10、valString(ep,D=.5.*(-9.8).*T.5;);engEvalString(ep,plot(T,D););最后,添加头文件:#include matlab.h 编译运行,就可以得到如(图1)所示的结果。图1 调用Matlab引擎输出结果上面例子是VC和Matlab的混合编程的一个简单应用,在实际的数值计算,控制系统开发等工程应用中,可以很好的利用VC和Matlab的混合编程技术,从而简化应用程序的开发工作量。5、结论Matlab提供了强大的数学计算功能和丰富的工具箱, 使用VC和Matlab的混合编程, 可以发挥各自特长, 缩短工程应用软件的开发周期, 同时也提高了程序的运行

11、效率。其中,基于客户机/服务器计算模式的Matlab引擎是实现VC与Matlab 混合编程的一种常用方法。通过对引擎调用与数据组织方式的面向对象的设计,将数据组织透明化,极大地简化了程序设计过程, 封装了对Matlab 引擎的访问和与Matlab 服务器进行数据交换的细节,为用户提供了一个友好的编程接口环境。VC+与Matlab混合编程之引擎操作详解 Posted on 2006-12-05 18:58 济公 阅读(3516) 评论(13) 编辑收藏 引用 所属分类: VCMatlab Visual C+ 是当前主流的应用程序开发环境之一,开发环境强大,开发的程序执行速度快。但在科学计算方面函

12、数库显得不够丰富、读取、显示数据图形不方便。 Matlab 是一款将数值分析、矩阵计算、信号处理和图形显示结合在一起,包含大量高度集成的函数可供调用,适合科学研究、工程设计等众多学科领域使用的一种简洁、高效的编程工具。不过由于 Matlab 使用的是解释性语言,大大限制了它的执行速度和应用场合。基于 VC 和 Matlab 混合编程是很多熟悉 VC+ 编程而又需要进行科学计算、数据仿真的科研人员常用的一种方式,其中最简单也最直接的方法就是调用 Matlab 引擎。本文以下部分将详细介绍通过 VC+6.0 调用 Matlab6.5 引擎来达到 VC+ 与 Matlab 数据共享编程的方法。 1.

13、 什么是 Matlab 引擎 所谓 Matlab 引擎( engine ),是指一组 Matlab 提供的接口函数,支持 C/C+ 、 Fortran 等语言,通过这些接口函数,用户可以在其它编程环境中实现对 Matlab 的控制。可以主要功能有: 打开 / 关闭一个 Matlab 对话; 向 Matlab 环境发送命令字符串; 从 Matlab 环境中读取数据; 向 Matlab 环境中写入数据。 与其它各种接口相比,引擎所提供的 Matlab 功能支持是最全面的。通过引擎方式,应用程序会打开一个新的 Matlab 进程,可以控制它完成任何计算和绘图操作。对所有的数据结构提供 100% 的支

14、持。同时,引擎方式打开的 Matlab 进程会在任务栏显示自己的图标,打开该窗口,可以观察主程序通过 engine 方式控制 Matlab 运行的流程,并可在其中输入任何 Matlab 命令。 实际上,通过引擎方式建立的对话,是将 Matlab 以 ActiveX 控件方式启动的。在 Matlab 初次安装时,会自动执行一次: matlab /regserver将自己在系统的控件库中注册。如果因为特殊原因,无法打开 Matlab 引擎,可以在 Dos 命令提示符后执行上述命令,重新注册。 2. 配置编译器 要在 VC 中成功编译 Matlab 引擎程序,必须包含引擎头文件 engine.h 并

15、引入 Matlab 对应的库文件 libmx.lib 、 libmat.lib 、 libeng.lib 。具体的说,打开一个工程后,做如下设置(以 VC6 为例): 1) 通过菜单工程 / 选项,打开设置属性页,进入 Directories 页面,在目录下拉列表框中选择 Include files ,添加路径: C:matlabexterninclude (假定 matlab 安装在 C:matlab 目录)。 2) 选择 Library files ,添加路径: C:matlabexternlibwin32microsoftmsvc60 。 3) 通过菜单工程 / 设置,打开工程设置属性页

16、,进入 Link 页面,在 Object/library modules 编辑框中,添加文件名 libmx.lib libmat.lib libeng.lib 。 以上步骤 1) 、 2) 只需设置一次,而步骤 3) 对每个工程都要单独设定,对于其它 C+ 编译器如 Borland C+ builder ,设置大体相同,不再赘述。 3. 引擎 API 详解 在调用 Matlab 引擎之前,首先应在相关文件中加入一行: #include enging.h ,该文件包含了引擎 API 函数的说明和所需数据结构的定义。可以在 VC 中调用的引擎函数分别如下: 3.1 引擎的打开和关闭 engOpen

17、 打开 Matlab engine函数声明: Engine *engOpen(const char *startcmd); 参数 startcmd 是用来启动 Matlab 引擎的字符串参数,在 Windows 操作系统中只能为 NULL 。 函数返回值是一个 Engine 类型的指针,它是在 engine.h 中定义的 engine 数据结构。 EngClose 关闭 Matlab 引擎 函数声明: int engClose(Engine *ep); 参数 ep 代表要被关闭的引擎指针。 函数返回值为 0 表示关闭成功,返回 1 表示发生错误。 例如,通常用来打开 / 关闭 Matlab 引

18、擎的代码如下: Engine *ep; / 定义 Matlab 引擎指针。 if (!(ep=engOpen(NULL) / 测试是否启动 Matlab 引擎成功。 MessageBox(Cant start Matlab engine! );exit(1);. engClose(ep); / 关闭 Matlab 引擎。 3.2 向 Matlab 发送命令字符串 engEvalString 发送命令让 Matlab 执行。 函数声明: int engEvalString(Engine *ep, Const char *string); 参数 ep 为函数 engOpen 返回的引擎指针,字符串

19、 string 为要 matlab 执行的命令。 函数返回值为 0 表示成功执行,返回 1 说明执行失败(如命令不能被 Matlab 正确解释或 Matlab 引擎已经关闭了)。 3.3 获取 Matlab 命令窗口的输出 要在 VC 中获得函数 engEvalString 发送的命令字符串被 Matlab 执行后在 matlab 窗口中的输出,可以调用 engOUtputBuffer 函数。 函数声明: int engOutputBuffer(Engine *ep, char *p, int n); 参数 ep 为 Matlab 引擎指针, p 为用来保存输出结构的缓冲区, n 为最大保存的

20、字符个数,通常就是缓冲区 p 的大小。该函数执行后,接下来的 engEvalString 函数所引起的命令行输出结果会在缓冲区 p 中保存。如果要停止保存,只需调用代码: engOutputBuffer(ep, NULL, 0) 。 3.4 读写 Matlab 数据 3.4.1 从 Matlab 引擎工作空间中获取变量。 mxArray *engGetVariable(Engine *ep, const char *name); 参数 ep 为打开的 Matlab 引擎指针, name 为以字符串形式指定的数组名。 函数返回值是指向 name 数组的指针,类型为 mxArray* ( mxAr

21、ray 数据类型在本文第 4 节详细简介)。 3.4.2 向 Matlab 引擎工作空间写入变量。 int engPutVariable(Engine *ep, const char *name, const mxArray *mp); 参数 ep 为打开的 Matlab 引擎指针, mp 为指向被写入变量的指针, name 为变量写入后在 Matlab 引擎工作空间中的变量名。 函数返回值为 0 表示写入变量成功,返回值为 1 表示发生错误。 3.5 调用引擎时显示 / 隐藏 Matlab 主窗口 默认情况下,以 engine 方式调用 Matlab 的时候,会打开 Matlab 主窗口,可

22、在其中随意操作。但有时也会干扰应用程序的运行,可用以下设置是否显示该窗口。 int engSetVisible(Engine *ep, bool value); 参数 ep 为打开的 Matlab 引擎指针, value 为是否显示的标志,取值 true (或 1 )表示显示 Matlab 窗口,取值 false (或 0 )表示隐藏 Matlab 窗口。 函数返回值为 0 表示设置成功,为 1 表示有错误发生。 要获得当前 Matlab 窗口的显示 / 隐藏情况,可以调用函数: int engGetVisible(Engine *ep, bool *value); 参数 ep 为打开的 Ma

23、tlab 引擎指针, Value 为用来保存显示 / 隐藏情况的变量(采用指针方式传递)。 函数返回值为 0 表示获取成功,为 1 表示有错误发生。 4. 数据类型 mxArray 的操作 在上节的 Matlab 引擎函数中,所有与变量有关的数据类型都是 mxArray 类型。数据结构 mxArray 以及大量的 mx 开头的函数,广泛用于 Matlab 引擎程序和 Matlab C 数学库中。 mxArray 是一种很复杂的数据结构,与 Matlab 中的 array 相对应,我们只需熟悉 Matlab 的 array 类型和几个常用的 mxArray 函数即可。 在 VC 中,所有和 Ma

24、tlab 的数据交互都是通过 mxArray 来实现的,在使用 mxArray 类型的程序中,应包含头文件 matrix.h ,不过在引擎程序中,一般会包含头文件 engine.h ,该文件里面已经包含了 matrix.h ,因此无需重复包含。 4.1 创建和清除 mxArray 型数据 Matlab 有很多种变量类型,对应于每种类型,基本上都有一个函数用于创建,但它们都有相同的数据结构,就是 mxArray 。 数组的建立采用 mxCreatexxx 形式的函数,例如新建一个 double 类型数组,可用函数 mxCreateDoubleMatrix ,函数形式如下: mxArray *mx

25、CreateDoubleMatrix(int m, int n, mxComplexity ComplexFlag); 参数 m 和 n 为矩阵的函数和列数。 ComplexFlag 为常数,用来区分矩阵中元素是实数还是复数,取值分别为 mxREAL 和 mxCOMPLEX 。 例如,创建一个 3 行 5 列的二维实数数组,可用如下语句: mxArray *T = mxCreateDoubleMatrix(3, 5, mxREAL); 对应的,要删除一个数组 mxDestroyArray ,该函数声明如下: void mxDestroyArray(mxArray *array_ptr); 参数

26、 array_ptr 为要删除的数组指针。 例如,要删除上面创建的数组 T ,可用如下语句: mxDestroyArray(T); 类似的创建函数还有: mxArray *mxCreateString(const char *str); 创建一个字符串类型并初始化为 str 字符串。 一般的在 VC 与 Matlab 交互中,以上两种类型就够了,其它类型数组的创建这里不再介绍。 4.2 管理 mxArray 数据类型 4.2.1 管理 mxArray 数据大小 要获得 mxArray 数组每一维上元素的个数,可以用 mxGetM 和 mxGetN 函数。其中 mxGetM 用来获得数组第一维的

27、元素个数,对于矩阵来说就是行数。 int mxGetM(const mxArray *array_ptr); / 返回 array_ptr 对应数组第一维的元素个数(行数) int mxGetN(const mxArray *array_ptr); / 返回 array_ptr 对应数组其它维的元素个数,对于矩阵来说是列数。对于多维数组来说是从第 2 维到最后一维的各维元素个数的乘积。 要获得某一特定维的元素个数,则要用函数: const int *mxGetDimensions(const mxArray *array_ptr); 该函数返回 array_ptr 各维的元素个数保存在一个 i

28、nt 数组中返回。对于常用的矩阵来说,用 mxGetM 和 mxGetN 两个函数就可以了。 另外还可以通过 mxGetNumberOfDimensions 来获得数组的总的维数,用 mxSetM 、 mxSetN 设置矩阵的行数和列数,函数说明如下: int mxGetNumberOfDimensions(const mxArray *array_ptr); / 返回数组的维数 void mxSetM(mxArray *array_ptr, int m); / 设置数组为 m 行 void mxSetN(mxArray *array_ptr, int n); / 设置数组为 n 列 4.2.

29、2 判断 mxArray 数组类型 在对 mxArray 类型的变量进行操作之前,可以验证以下其中的数组的数据类型,比如是否为 double 数组、整数、字符串、逻辑值等,以及是否为某种结构、类、或者是特殊类型,比如是否为空数组,是否为 inf 、 NaN 等。常见的判断函数有: bool mxIsDouble(const mxArray *array_ptr);bool mxIsComplex(const mxArray *array_ptr);bool mxIsChar(const mxArray *array_ptr);bool mxIsEmpty(const mxArray *arra

30、y_ptr);bool mxIsInf(double value); 这些函数比较简单,意义自明,不再解释。 4.2.3 管理 mxArray 数组的数据 对于常用的 double 类型的数组,可以用 mxGetPr 和 mxGetPi 两个函数分别获得其实部和虚部的数据指针,这两个函数的声明如下: double *mxGetPr(const mxArray *array_ptr); / 返回数组 array_ptr 的实部指针 double *mxGetPi(const mxArray *array_ptr); / 返回数组 array_ptr 的虚部指针 这样,就可以通过获得的指针对 mxArray 类型的数组中的数据进行读写操作。例如可以用函数 engGetVariable 从 Matlab 工作空间读入 mxArray 类型的数组,然后用 mxGetPr 和 mxGetPi 获得数据指针,对并其中的数据进行处理,最后调用 engPutVariable 函数

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1