毕业设计论文VC与MATLAB混合编程.doc
《毕业设计论文VC与MATLAB混合编程.doc》由会员分享,可在线阅读,更多相关《毕业设计论文VC与MATLAB混合编程.doc(27页珍藏版)》请在三一办公上搜索。
1、摘要Visual C+功能强大,能够形成各种用户界面,甚至能对底层硬件进行操作。但是在开发一些较为复杂的算法时,是比较麻烦的。幸运的是Matlab作为一个功能强大且不断更新的软件包为我们提供了各种复杂算法。如果能将Matlab开发好的算法直接为VC程序员所用,那将大大缩短开发周期,降低产品成本。本文正是研究如何在VC集成环境中调用Matlab的数学计算函数,等效为自己的函数。主要有两种方法,一是在Visual C+中调用Matlab引擎,二是在Visual C+中调用Matlab数学函数库。关键字Visual C+Matlab程序设计Abstract:Visual C+ has powerfu
2、l function, and it can supply a considerable variety of UI, and even can operate hardware. But it is inconvenient when we implement some more complex arithmetic. Fortunately MATLAB provides a variety of complex arithmetic as a powerful and updated continually software packet. It will cut the cost of
3、 product and implementation period. This thesis is about using matlab function in VC IDE as itself. There are two methods: one is using Matlab Engine in Visual C +. The other one is using Matlab math library in Visual C+. Key wordsVisual C+MatlabProgram Design24VC+与Matlab混合编程目 录摘要IABSTRACT:II第一章 前言1
4、1.1 Matlab功能及其体系11.2 Matlab外部接口概述31.2.1 mxArray 数据结构31.2.2 mx函数应用81.2.3 eng函数11第二章VISUAL C+调用MATLAB引擎132.1概述142.2 Matlab的环境配置142.3使用VC+6.0向导生成应用程序15第三章VISUAL C+调用MATLAB数学库183.1使用Matlab数学函数库的环境设置183.2 在Visual C+中调用MATLAB数学函数库19总结22附录24参考文献26第一章 前言1.1 Matlab功能及其体系MATLAB 产品是用来解决工程与科学实际问题的工程软件,而外部接口编程是该
5、软件的一项基本功能。掌握MATLAB 的基本使用方法是学习MATLAB 外部接口编程的基础,所以在正式学习使用MATLAB 外部接口编程之前,首先回顾一下MATLAB 软件的基本环境及其使用方法,并了解一下MATLAB 的产品体系。MATLAB 的名称源自Matrix Laboratory,它的首创者是在数值线性代数领域颇有影响的Cleve Mofer 博士,同时他也是生产和经营MATLAB 产品的美国Mathworks公司的创始人之一。MATLAB本身是一种科学计算软件,专门以矩阵的形式处理数据。MATLAB将高性能的数值计算和可视化集成在一起,并提供了大量的内置函数,还提供了一种高级的解释
6、型编程语言M 语言。MATLAB 产品具有良好的开放性和扩充性,利用MATLAB 提供的科学计算能力和M 语言编程能力开发了很多专业函数并组成了不同的工具箱,而这些工具箱产品被广泛地应用于科学计算、控制系统、信息处理等领域的分析、仿真和设计工作中。大多数的MATLAB 工具箱中所包含的代码都是开放的,这使得丁几程师在使用MATLAB 软件解决工程问题,不断深化对问题认识的同时,还可以非常容易地对MATLAB 的功能进行扩充,从而不断完善MATLAB 产品以提高产品自身的竞争能力。口前MATLAB 产品族主要应用于以下领域: 数值分析; 数值和符号计算; 工程与科学绘图; 控制系统的设计与仿真;
7、 数字图像处理; 数字信号处理; 财务与金融工程; 图形化的用户界面开发。MATLAB 产品由若干个模块组成,不同的模块完成不同的功能,其中包括:. MATLAB;. MATLAB Toolboxes;. MATLAB Compiler;. Simulink;. Simulink Blocksets;. Real-Time Workshop(RTW);. Stateflow;. Stateflow Coder;图1-1 MATLAB的产品体系由这些模块构成MATLAB产品体系如图1-1所示。其中,MATLAB 是MATLA产品家族的基础,它提供了基本的数学算法,例如矩阵运算、数值分析算法等,M
8、ATLAB 集成了2D 和3D 图形功能,以完成相应的数值可视化工作,同时MATLAB 还提供了一种交互式的高级编程语言M语言,利用M 语言可以通过编写脚本或者函数文件实现用户自己的算法。1.2 Matlab外部接口概述尽管利用MATLAB 提供的高级编程语言 M 语言进行程序开发已经基本能够满足一般算法开发的需要了,但是在很多情况下,MATLAB 的用户仍需要将MATLAB 同其它的软件或者开发语言结合在一起共同完成算法开发的任务,例如在工程中广泛应用的C 语言或者Fortran 语言。广大MATLAB 的用户提出的需求包括: 在MATLAB 中调用已有的C 语言或者Fortran 语言的代
9、码。 在C 语言或者Fortran 语言中调用MATLAB 的算法。 利用COM 标准进行客户端服务器模式开发,例如在Visual Basic 程序或者Microsoft Excel中调用 。 在MATLAB 中直接加载动态链接库。 在M 语言中使用Java 类。在解决这些问题的时候,都可以使用MATLAB 的外部接口功能。根据题目要求本文只讨论Matlab与Visual C+间的接口问题。1.2.1 mxArray 数据结构MATLAB 软件是以矩阵为基本运算单位的,这与C 语言不同,在C 语言中,只有基本的双精度类型、整数类型、字符类型的变量定义,它们和MATLAB 中相应类型的变量定义是
10、不一样的。为了能够在C 语言中表示MATLAB 的数据,MATLAB 提供了一个特殊的C 语言结构mxArray ,这个结构就是用来在C 语言中表示MATLAB 数据的,在MATLAB 的C 语言外部接口编程中将大量使用该结构。mxArray 本身是一个C 语言的结构,该结构的定义在Matrix.h 文件中,它的定义如下:struct mxArray_tag void*reserved; int reservedl2 ; void*reserved2 ; int number_of_dims ; unsigned int reserved3 ; struct unsigned int scal
11、ar_flag : l ; unsigned int flagl:1 ; unsigned int flag2:l ; unsigned int flag3:1 ; unsigned int flag4:l ; unsigned int flag5:l ;unsigned int flag6:1 ; unsigned int flag7:l ; unsigned int private_data_flag:l ; unsigned int flag8:1 ; unsigned int flag9:1 ; unsigned int flag10:1 ; unsigned int flag11:4
12、 ; unsigned int flagl2:8 ; unsigned int flagl3:8 ; flags ; unsigned int reserved42 ; union struct void*pdata ; void*pimag_data ; void*reserved5 ; int reserved63 ; number_array ; data ; ; mxArray 结构由很多个字段组成,这些字段完成了记录MATLAB 数据的工作。一般地,mxArray 在记录一个数据时,需要保存下列信息:数据类型。数组维数。与数组相关的数据(尺寸和数据)。如果是数值对象,则保存数据对象是
13、实数还是虚数。如果是稀疏矩阵,则保存矩阵中非零元素的个数和索引。如果是结构和对象,则保存字段的数量和相应的名称。在图1-1 中显示了mxArray保存双精度矩阵的情况。 从图1-1可以看出,mxArray 将MATLAB 数据的信息分别保存在不同的字段里,例如m 和n 分别表示二维矩阵的行数和列数;对于多维数组,m 是矩阵的行数,而n 是数组中每一个矩阵的列数、页面数和其它数据的乘积。维数保存着数据对象实际的维数,而size字段存储着每个维存储数据元素的个数。pr为实部数据的指针,pi 是虚部数据的指针,如果没有虚部数据,则pi为NULL。但是,在mxArray数据结构的定义中是不能直接找到这
14、些字段的对应关系的,如果需要操作该数据对象,则需要使用专门的函数。一般的情况下,直接操作mxArray 对象比较困难,而且在使用mxArray 数据对象时,都必须使用mxArray 数据类型的指针来完成工作。为了便于创建和访问mxArray 数据对象,MATLAB 提供了相应的函数,这些函数就是MATLAB 提供的mx 函数,该函数具有C 语言的形式,利用这些函数不需要直接对mxArray 结构对象的字段进行赋值或者读取了。关于C 语言的mx 函数创建数据对象的方法将在后面的内容进行介绍,而详细的C 语言mx函数的解释请参阅MATLAB 的帮助文档。在进行外部接口编程时,获取数据类型信息是经常
15、需要的一种操作。在mxArray 结构中同样也保存着这样的信息,这类信息是通过mxClassID 的枚举类型变量来保存的,该枚举类型定义如下:typedef enum mxUNKNOWN_CLASS = 0 , mxCELLes_CLASS , mxSTRUCT_CLASS , mxLOGICAL_CLASS , mxCHAR_CLASS , mxSPARSE_CLASS , / * OBSOLETE ! DO NOT USE * / mxDOUBLE_CLASS , mxSINGLE_CLASS , mxlNT8_CLASS , mxUINT8_CLASS , mxINT16_CLASS ,
16、 mxUINT16_CLASS , mxINT32_CLASS , mxUINT32_CLASS , mxINT64_CLASS , / * place holder 一future enhancements * / mxUINT64_CLASS , / * place holder 一future enhancements * / mxFUNCTION_CLASS , mxOPAQUE_CLASS , mxOBJECT_CLASS mxClassID ; 在MEX 文件中进行数据类型判断时,将返回InxClassID 类型的变量。此外,针对复数和实数也定义了一个枚举类型,该枚举类型的变量将在
17、C 语言应用程序中加以定义。它的定义如下:typedef enum mxREAL , mxCOMPLEX mxComplexity ; 在C 语言中创建mxArray 数值类型对象需要指定数据是复数类型还是实数类型。为了能够保存字符串类型的变量,在Matrix.h 文件中还专门定义了相应的数据类型mxChar 。mxChar 是mxArray 存储字符类型数据时使用的变量类型,该数据类型使用了16 位的无符号整数,定义如下:typedef uintl6_T mxChar ; 这里unitl6_T是MATLAB 自定义的数据类型符号,相当于C语言中unsigned int 的定义。为了便于用户学
18、习外部接口编程,MATLAB 也提供了相应的示例。在Windows 平台下,这些示例都保存在MATLABROOTexternexamples 目录中,在mex 子目录下都是相应的MEX函数文件例子。1.2.2 mx函数应用MATLAB 语言使用单一的对象类型,这就是MATLAB 阵列。所有的MATLAB 变量,包括数量、向量、矩阵、字符串、单元阵列、结构体等,都以MATLAB 阵列的方式进行存储。在C 语言中,MATLAB 阵列声明为数据结构mxArray ,该数据结构包含下面的内容:. 语言的类型;它的维数;它的数据;如果是数值型,则变量是实数或复数;如果是结构或对象,则要指定字段数和字段名
19、。在上一节中,我们可以使用engGetVariable engPutVariable函数中对mxArray 进行读写,但我们还希望对mxArray 进行操作,比如创建和删除mxArray 、管理mxArray 的维数、管理InxArray 的数据等。在MATLAB 的C 函数库中定义了一系列函数来完成对mxArray 的操作。1创建和清除MATLAB 阵列 MATLAB 有多种变量类型,对每种数据类型都有一个函数来创建,这些创建函数有统一的形式,这就是mxcreatexxx 。例如创建一个二维的double 型数据类型mxArray 采用下面的函数: mxArray*mxCreateDoubl
20、eMatrix(intm,int n,mxComplexity ComplexFlag );其中:m 为阵列的行数,n 为阵列的列数。ComPlexFlag 为常数,取mxREAL和mxCOMPLEX ,分别代表阵列中的数据是实数还是复数。函数如果调用成功,则返回一个指向数据结构mxArray 的指针,否则返回NULL。 mxArray使用结束后需要调用mxDestroyArray 函数从内存中把它删除。mxDestroyArray 的声明为: void mxDestroyArray(mxArray*array_ptr ); 其中array_ptr为需要删除的mxArray指针。下面的代码显示
21、了创建和删除MATLAB阵列函数的使用方法。mxArray*temp=mxCreateDoubleMatrix (1,l,mxREAL);mxDestroyArray(temp);表1-1 列出了创建阵列的函数。函数名功能MxCreateDoubleMatrix创建二维double 型阵列mxCreateCellArray创建多维单元阵列mxCreateCellMatrix创建二维的单元阵列mxCreateCharArray创建多维字符阵列mxCreateSparse创建稀疏矩阵mxCreateNumericArray创建多维数值阵列mxCreateString创建字符串mxCreateStr
22、uctArray创建结构体阵列mxCreateStructArray创建结构体阵列mxCreateStructMatrix创建结构体矩阵表1-1阵列创建函数。2.管理数组的维数采用mxGetM和mxGetN函数来得到矩阵的行数和列数。它们的声明如下:int mxGetM(const mxArray*array_ptr);int mxGetN(const mxArray*array_ptr ); 其中:array_ptr为指向mxArray的指针。返回值分别是矩阵的行数和列数。如果要得到mxArray的维数,可以调用mxGetNumberOfDimensions 函数。它的声明如下: int m
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 毕业设计 论文 VC MATLAB 混合 编程
链接地址:https://www.31ppt.com/p-4860344.html