VC与MATLAB混合编程_第1页
VC与MATLAB混合编程_第2页
VC与MATLAB混合编程_第3页
VC与MATLAB混合编程_第4页
VC与MATLAB混合编程_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

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

文档简介

1、摘要摘要 Visual C+功能强大,能够形成各种用户界面,甚至能对底层硬件进行操作。但是 在开发一些较为复杂的算法时,是比较麻烦的。幸运的是 Matlab 作为一个功能强大且不 断更新的软件包为我们提供了各种复杂算法。如果能将 Matlab 开发好的算法直接为 VC 程序员所用,那将大大缩短开发周期,降低产品成本。本文正是研究如何在 VC 集成环境 中调用 Matlab 的数学计算函数,等效为自己的函数。主要有两种方法,一是在 Visual C+中调用 Matlab 引擎,二是在 Visual C+中调用 Matlab 数学函数库。 关键字 Visual C+ Matlab 程序设计 Abs

2、tract: Visual C+ has powerful 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 pac

3、ket. It will cut the cost of 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 words Visual C+ Matlab Program Design 目 录 摘要摘要

4、 .I ABSTRACT:.II 第一章第一章 前言前言.1 1.1 MATLAB功能及其体系.1 1.2 MATLAB外部接口概述.3 1.2.1 mxArray 数据结构.3 1.2.2 mx 函数应用.8 1.2.3 eng 函数.11 第二章第二章 VISUAL C+调用调用 MATLAB 引擎引擎.13 2.1 概述.14 2.2 MATLAB的环境配置.14 2.3 使用 VC+6.0 向导生成应用程序.15 第三章第三章 VISUAL C+调用调用 MATLAB 数学库数学库.18 3.1 使用 MATLAB数学函数库的环境设置.18 3.2 在 VISUAL C+中调用 MAT

5、LAB 数学函数库.19 总结总结.22 附录附录.24 参考文献参考文献.26 第一章 前言 1.1 Matlab 功能及其体系 MATLAB 产品是用来解决工程与科学实际问题的工程软件,而外部接口编程是该软 件的一项基本功能。掌握 MATLAB 的基本使用方法是学习 MATLAB 外部接口编程的基 础,所以在正式学习使用 MATLAB 外部接口编程之前,首先回顾一下 MATLAB 软件的 基本环境及其使用方法,并了解一下 MATLAB 的产品体系。 MATLAB 的名称源自 Matrix Laboratory,它的首创者是在数值线性代数领域颇有影 响的 Cleve Mofer 博士,同时他

6、也是生产和经营 MATLAB 产品的美国 Mathworks 公司的 创始人之一。MATLAB 本身是一种科学计算软件,专门以矩阵的形式处理数据。 MATLAB 将高性能的数值计算和可视化集成在一起,并提供了大量的内置函数,还提供 了一种高级的解释型编程语言M 语言。MATLAB 产品具有良好的开放性和扩充性, 利用 MATLAB 提供的科学计算能力和 M 语言编程能力开发了很多专业函数并组成了不 同的工具箱,而这些工具箱产品被广泛地应用于科学计算、控制系统、信息处理等领域 的分析、仿真和设计工作中。大多数的 MATLAB 工具箱中所包含的代码都是开放的,这 使得丁几程师在使用 MATLAB

7、软件解决工程问题,不断深化对问题认识的同时,还可以 非常容易地对 MATLAB 的功能进行扩充,从而不断完善 MATLAB 产品以提高产品自身 的竞争能力。 口前 MATLAB 产品族主要应用于以下领域: 数值分析; 数值和符号计算; 工程与科学绘图; 控制系统的设计与仿真; 数字图像处理; 数字信号处理; 财务与金融工程; 图形化的用户界面开发。 MATLAB 产品由若干个模块组成,不同的模块完成不同的功能,其中包括: . MATLAB; . MATLAB Toolboxes; . MATLAB Compiler; . Simulink; . Simulink Blocksets; . Re

8、al-Time Workshop(RTW); . Stateflow; . Stateflow Coder; 图 1-1 MATLAB 的产品体系 由这些模块构成 MATLAB 产品体系如图 1-1 所示。其中,MATLAB 是 MATLA 产品家 族的基础,它提供了基本的数学算法,例如矩阵运算、数值分析算法等,MATLAB 集成 了 2D 和 3D 图形功能,以完成相应的数值可视化工作,同时 MATLAB 还提供了一种交 互式的高级编程语言M 语言,利用 M 语言可以通过编写脚本或者函数文件实现用户 自己的算法。 1.2 Matlab 外部接口概述 尽管利用 MATLAB 提供的高级编程语言

9、 M 语言进行程序开发已经基本能够满足 一般算法开发的需要了,但是在很多情况下,MATLAB 的用户仍需要将 MATLAB 同其 它的软件或者开发语言结合在一起共同完成算法开发的任务,例如在工程中广泛应用的 C 语言或者 Fortran 语言。广大 MATLAB 的用户提出的需求包括: 在 MATLAB 中调用已有的 C 语言或者 Fortran 语言的代码。 在 C 语言或者 Fortran 语言中调用 MATLAB 的算法。 利用 COM 标准进行客户端服务器模式开发,例如在 Visual Basic 程序或者 Microsoft Excel 中调用 。 在 MATLAB 中直接加载动态链

10、接库。 在 M 语言中使用 Java 类。 在解决这些问题的时候,都可以使用 MATLAB 的外部接口功能。根据题目要求本文只讨 论 Matlab 与 Visual C+间的接口问题。 1.2.11.2.1 mxArraymxArray 数据结构数据结构 MATLAB 软件是以矩阵为基本运算单位的,这与 C 语言不同,在 C 语言中,只有 基本的双精度类型、整数类型、字符类型的变量定义,它们和 MATLAB 中相应类型的变 量定义是不一样的。为了能够在 C 语言中表示 MATLAB 的数据,MATLAB 提供了一 个特殊的 C 语言结构mxArray ,这个结构就是用来在 C 语言中表示 MA

11、TLAB 数据 的,在 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 scalar_flag : l ; unsigned int flagl:1 ; unsigned int flag2:l ; unsigned

12、 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 ; unsigned int flagl2:8 ; unsigned int flagl3:8 ; flags ; unsigned

13、 int reserved42 ; union struct void*pdata ; void*pimag_data ; void*reserved5 ; int reserved63 ; number_array ; data ; ; mxArray 结构由很多个字段组成,这些字段完成了记录 MATLAB 数据的工作。一般 地,mxArray 在记录一个数据时,需要保存下列信息: 数据类型。 数组维数。 与数组相关的数据(尺寸和数据)。 如果是数值对象,则保存数据对象是实数还是虚数。 如果是稀疏矩阵,则保存矩阵中非零元素的个数和索引。 如果是结构和对象,则保存字段的数量和相应的名称。 在图

14、 1-1 中显示了 mxArray 保存双精度矩阵的情况。 从图 1-1 可以看出,mxArray 将 MATLAB 数据的信息分别保存在不同的字段里, 例如 m 和 n 分别表示二维矩阵的行数和列数;对于多维数组,m 是矩阵的行数,而 n 是数组中每一个矩阵的列数、页面数和其它数据的乘积。维数保存着数据对象实际 的维数,而 size 字段存储着每个维存储数据元素的个数。pr 为实部数据的指针,pi 是虚部数据的指针,如果没有虚部数据,则 pi 为 NULL。但是,在 mxArray 数据结 构的定义中是不能直接找到这些字段的对应关系的,如果需要操作该数据对象,则需 要使用专门的函数。一般的情

15、况下,直接操作 mxArray 对象比较困难,而且在使用 mxArray 数据对象时,都必须使用 mxArray 数据类型的指针来完成工作。为了便于 创建和访问 mxArray 数据对象,MATLAB 提供了相应的函数,这些函数就是 MATLAB 提供的 mx 函数,该函数具有 C 语言的形式,利用这些函数不需要直接对 mxArray 结构对象的字段进行赋值或者读取了。关于 C 语言的 mx 函数创建数据对 象的方法将在后面的内容进行介绍,而详细的 C 语言 mx 函数的解释请参阅 MATLAB 的帮助文档。在进行外部接口编程时,获取数据类型信息是经常需要的一 种操作。在 mxArray 结构

16、中同样也保存着这样的信息,这类信息是通过 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 , mxUINT16_CLASS ,

17、 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 类型的变量。此外,针对 复数和实数也定义了一个枚举类型,该枚举类型的变量将在 C 语言应用程序中加以

18、 定义。它的定义如下: typedef enum mxREAL , mxCOMPLEX mxComplexity ; 在 C 语言中创建 mxArray 数值类型对象需要指定数据是复数类型还是实数类型。为 了能够保存字符串类型的变量,在 Matrix.h 文件中还专门定义了相应的数据类型 mxChar 。mxChar 是 mxArray 存储字符类型数据时使用的变量类型,该数据类型使用了 16 位的无符号整数,定义如下: typedef uintl6_T mxChar ; 这里 unitl6_T 是 MATLAB 自定义的数据类型符号,相当于 C 语言中 unsigned int 的 定义。

19、为了便于用户学习外部接口编程,MATLAB 也提供了相应的示例。在 Windows 平 台下,这些示例都保存在MATLABROOTexternexamples 目录中,在 mex 子目录下都 是相应的 MEX 函数文件例子。 1.2.21.2.2 mxmx 函数应用函数应用 MATLAB 语言使用单一的对象类型,这就是 MATLAB 阵列。所有的 MATLAB 变 量,包括数量、向量、矩阵、字符串、单元阵列、结构体等,都以 MATLAB 阵列的方式 进行存储。在 C 语言中,MATLAB 阵列声明为数据结构 mxArray ,该数据结构包含下 面的内容: . 语言的类型; 它的维数; 它的数据

20、; 如果是数值型,则变量是实数或复数; 如果是结构或对象,则要指定字段数和字段名。 在上一节中,我们可以使用 engGetVariable engPutVariable 函数中对 mxArray 进行读 写,但我们还希望对 mxArray 进行操作,比如创建和删除 mxArray 、管理 mxArray 的 维数、管理 InxArray 的数据等。在 MATLAB 的 C 函数库中定义了一系列函数来完成对 mxArray 的操作。 1创建和清除 MATLAB 阵列 MATLAB 有多种变量类型,对每种数据类型都有一个函数来创建,这些创建函数有 统一的形式,这就是 mxcreatexxx 。例如

21、创建一个二维的 double 型数据类型 mxArray 采 用下面的函数: mxArray*mxCreateDoubleMatrix(int m,int n,mxComplexity ComplexFlag ); 其中:m 为阵列的行数,n 为阵列的列数。ComPlexFlag 为常数,取 mxREAL 和 mxCOMPLEX ,分别代表阵列中的数据是实数还是复数。函数如果调用成功,则返回一 个指向数据结构 mxArray 的指针,否则返回 NULL。 mxArray 使用结束后需要调用 mxDestroyArray 函数从内存中把它删除。 mxDestroyArray 的声明为: void

22、 mxDestroyArray(mxArray*array_ptr ); 其中 array_ptr 为需要删除的 mxArray 指针。 下面的代码显示了创建和删除 MATLAB 阵列函数的使用方法。 mxArray*temp=mxCreateDoubleMatrix (1,l,mxREAL);mxDestroyArray(temp);表 1-1 列出 了创建阵列的函数。 函数名功能 MxCreateDoubleMatrix创建二维 double 型阵列 mxCreateCellArray创建多维单元阵列 mxCreateCellMatrix创建二维的单元阵列 mxCreateCharArra

23、y创建多维字符阵列 mxCreateSparse创建稀疏矩阵 mxCreateNumericArray创建多维数值阵列 mxCreateString创建字符串 mxCreateStructArray创建结构体阵列 mxCreateStructArray创建结构体阵列 mxCreateStructMatrix创建结构体矩阵 表 1-1 阵列创建函数。 2.管理数组的维数管理数组的维数 采用 mxGetM 和 mxGetN 函数来得到矩阵的行数和列数。它们的声明如下:int mxGetM(const mxArray*array_ptr); int mxGetN(const mxArray*arra

24、y_ptr ); 其中:array_ptr 为指向 mxArray 的指针。返回值分别是矩阵的行数和列数。如果要 得到 mxArray 的维数,可以调用 mxGetNumberOfDimensions 函数。它的声明如下: int mxGetNumberOfDimensions(const mxArray*array_ptr); 其中:函数返回值为 mxArray 的维数,它总是大于或等于 2。使用 mxGetNumberOfDimensions 可以得到 mxArray 的维数,而如果要得到特定维的元素个数, 则要调用函数 mxGetDimensions。它的声明如下: const int*

25、mxGetDimensions(const mxArray*array_ptr); 其中 array_ptr 为指向 mxArray 的指针,返回值为一个 int 数组,各维的元素个数将 保存在这个数组中。 另外还有两个与数组维数管理有关的函数,它们是: void mxsetM(mxArray*array_ptr,int m); void mxsetN(mxArray*array_ptr,int n); 它们分别设定矩阵行数 m 和列数 n。array_ptr 为指向 mxArray 的指针。 3.判断阵列类型判断阵列类型 由于 mxArray 变量类型众多,在对 mxArray 类型的变量进

26、行操作之前,需要判断它是 哪种类型的变量。同创建 mxArray 类型变量一样,MATLAB 提供了统一形式的变 量类型判断函数来完成各种类型变量的判断,它们具有 bool mxIsxxx 的统一形式。 表 1-2 列出了这些判断函数。 表 1-2 判断阵列类型函数函数表 函数名功能 mxIsChar判断是否为字符 mxIsClass判断是否为特定的类对象 mIsComplex判断是否为复数 mxIsDouble判断是否为双精度浮点数 mxIsEmpty判断是否为空阵列 mxIsFinite判断是否为有限 mxIsInf判断是否为无限 4.阵列访问函数阵列访问函数 MATLAB 提供了很多函数

27、来访问和操作阵列,它们通过获得 mxArray 指针来对阵列 中的数据进行读写。阵列访问函数具有 mxGetxxx 和 mxsetxxx 的形式,表 7-3 列出了 这些函数的名称及功能。 表 1-3 阵列访问函数 函数名功能 mxGetPi, mxGetPr获取包含阵列的虚部和实部数据的阵列 mxsetPi , mxsetPr设置阵列的虚部和实部数据 mxGetstring获取字符串 MxGetClassID获取 mxArray 结构体类型 MATLAB 提供的 mx 函数众多,上面列出了部分函数名及其功能描述,这些函数的 详细说明清参考 MATLAB 的在线帮助。 1.2.31.2.3 e

28、ngeng 函数函数 引擎库包含下面一些函数,这些函数完成对 MATLAB 计算引擎的控制。引擎库函数 的命名规则是在名称前面加上 3 个前缀字符“eng” 。下面简单介绍一下引擎库函数。 1.启动和关闭引擎启动和关闭引擎 (1) engOpen 函数 该函数启动 MATLAB 引擎,其函数声明如下: Engine*engOpen(const char*startcmd); 参数: startcmd:启动 MATLAB 进程的字符串,在 Windows 环境下,该字符串必须为 NULL。函数返回一个指向引擎句柄的指针。 函数 engOpen(startcmd)作用是启动一个 MATLAB 进程

29、、建立连接、返回一个惟一的 引擎标别符或在启动引擎失败时返回 NULL 。 ( 2 ) engClose 函数 该函数关闭 MATLAB 引擎。其函数声明如下: int engClose(Engine*ep); 参数: ep :引擎指针。 函数返回 0 表示关闭成功,返回 l 则关闭失败。 函数 engClose 的作用是关闭一个 MATLAB 引擎,它通过向 MATLAB 引擎发送一 个关闭命令来断开连接。 2 向向 MATLAB 发送命令发送命令 (l) engEvalString 函数 该函数向 MATLAB 发送一个字符串,让 MATLAB 执行,其函数声明如下:int engEval

30、string(Engine*ep,const char*string); 参数: ep :事先启动的引擎指针。 string:执行的字符串。 函数返回 0 表示执行成功,如果返回 l,则说明 ep 对应的引擎已经关闭。 (2) engOutPutBuffer 函数 该函数获取 MAfLAB 命令窗口的文字输出,其函数声明如下: int engOutPutBuffer(Engine*ep,char*p , int n); 其中 ep 为事先启动的 MATLAB 引擎指针,n 为缓冲区的大小,p 为字符串缓冲区指针。 OutPutBuffer 为函数 engEvalString 的返回值定义一个字

31、符串缓冲区,这个返回值通常显示 在屏幕上。要停止缓冲,只需要调用下面代码: engOutPutBuffer ( ep , NULL,0) 3.从从 MATLAB 发送和接收数据发送和接收数据 (1)engGetVariable 函数 该函数从 MATLAB 引擎工作空间复制一个变量,其函数声明如下: mxArray*engGetVariable(Engine*ep,const char*name ) ; 其中 ep 为事先打开的 MATLAB 引擎指针,name 为从 MATLAB 得到的变量。如果 函数调用成功,则返回一个 mxArray 类型的指针;如果失败,则返回 NULL , engG

32、etvariable 调用失败的情况一般是指定名称的变量不存在。 ( 2 ) engPutVariable 函数 该函数把变量写入 MATLAB 引擎的工作空间,其函数声明如下: int engPutVariable(Engine*ep,const char*name,const mxArray*mp ) ; 其中 ep 事先打开的引擎指针,name 为写入引擎工作空间中变量的名称,mp 为数组 针。PutVariable 把变量 mp 写入引擎 ep,指定变量名称 name。如果引擎工作空间中该名 称的变量不存在,则新创建该变量;如果引擎工作空间中同名的变量已经存在,则用新 变量代替已经存在

33、的变量 engPutVariable 函数返回 0 表示调用成功,出错则返回 l 。 4.显示或隐藏显示或隐藏 MATLAB 窗口窗口 (1)engGetVisible 函数 该函数判断当前 MATLAB 窗口是否可见,其函数声明如下: int engGetVisible(Engine*ep,bool*value); 其中:ep 为事先打开的引擎指针,value 为指向 gGetvisible 返回值的指针。 (2) engsetvisible 函数 该函数显示或隐藏 MATLAB 窗口,其函数声明如下: int engSetVisible(Engine*ep,bool value); 其中:

34、ep 为事先打开的引擎指针,value 为 MATLAB 设定的可见性属性。当属性 值为 1 时,MATLAB 窗口可见;为 0 时,MATLAB 窗口不可见。 下面的代码打开 MATLAB 引擎,并隐藏 MATLAB 窗口: Engine*ep; bool vis; ep=engOpen(NULL); engsetVisible(ep,0); 第二章第二章 Visual C+调用调用 Matlab 引擎引擎 尽管 MATLAB 在科学计算、系统设计分析等方面有着无可比拟的优势,但是从计算 机程序开发的角度上看,MATLAB 的 M 语言还是有些功能无法实现或者实现起来有一定 困难,例如复杂的

35、用户图形界面应用程序以及对计算机操作系统或者硬件设备操作的能 力等。为了能够在其它的高级语言中使用 MATLAB 的基本算法,MATLAB 提供了多种 手段来完成,其中计算引擎应用是相对常用也是最容易实现的一种。本章将详细介绍开 发 MATLAB 计算引擎应用程序的方法。 2.12.1 概述概述 MATLAB 计算引擎则是在 C 或 Fortran 语言环境中调用 MATLAB 函数的 方法。MATLAB 的计算引擎应用实际上就是利用 MATLAB 提供的一组接口函数 (API),在用户开发的 C 语言或者 Fortran 语言应用程序中,通过某种通信机制后台调 用 MATLAB 应用程序以完

36、成复杂的系统任务。计算引擎应用程序是在 MATLAB 环 境之外的可执行应用程序,在它们运行的过程中需要利用某种通信机制和另外一个 MATLAB 进程(会话)交互数据。在不同系统平台上,应用程序使用的通信机制是 不一样的,例如在 Unix 系统中使用管道(pipe)完成,而在 windows 平台中,这种通 信机制是利用 COM 应用接口 IEngine 来完成。 2.22.2 MatlabMatlab 的环境配置的环境配置 要实现 Visual C+调用 MATLAB 引擎进行混合编程,需要一个 MATLAB 库: libeng.lib。这个库要通过动态链接库 libbeng.dll 生成,

37、它们存在于 MATLABexterninclude 目录下。在 Visual C+的集成环境中建立和调试 MATLAB 引 擎程序的基本步骤如下: (1)启动 Microsoft Visua1 C+6.0 集成环境,建立 MFC Appwizard(exe)类型工程 。 (2)在项目工程创建完毕以后,选择下拉式菜单 Tools 中的菜单项 Options,将弹出 Options 对话框,选择其中的 Directories 属性页,在其中的 show directories for 下拉 式选项框中分别选择 Include Files 和 Library Files,在下部的编辑框中输入以下路径

38、: MATLAB 根目录externinclude MATLAB 根目录externlibwin32microsoftmsvc60 然后选择 OK 按钮。 (3)选择下拉式菜单 Project 中的菜单项 settings,打开工程设置属性页,选择 Link 页面,在 Object/Libra 即 modules 编辑框中,添加文件名 libmx.lib。 步骤(2)只需要设置一次,而步骤(3)则每个工程需要单独设定,因为每个工程使 用的 MATLAB 函数库可能不一样。因此,步骤(3)的设置可能不同,上面我们只设定 了 libmx.lib,这样我们只能使用 MATLAB 的引擎库。如果使用了

39、其他的库函数,则 需要添加相应的库文件。 VC 是通过使用 MATLAB 引擎库函数 engEvalstring 向 MATLAB 发出计算指令 的,MATLAB 环境中的参数(线性方程的参数)要通过 MATLAB 引擎库函数 engPutArray 输入,MATLAB 计算的结果要通过 MATLAB 引擎库函数 engGetArray 输入到 VC 环境中去。 2.32.3 使用使用 VC+6.0VC+6.0 向导生成应用程序向导生成应用程序 本小节利用例 simpleengdemo.c(见附录)的代码和 Microsoft Visual studio6 来讲解使 用集成开发环境进行计算引擎

40、应用程序编译的完整过程。 首先启动 visual studio ,然后执行“File ”菜单下的“New ”命令,在弹出的对话框中选 择“Win32 Console Application ”作为即将创建的应用程序类型,在“Project name ”文本 输入框处设定应用程序的工程名称,也就是未来生成的可执行程序的名称,如图- 所 示。 单击“OK ”按钮之后,在弹出的对话框中选择创建空的项口文件选项,并且单击对 话框的“Finish ”按钮,这样 VisualC +将自动创建一个空白的项目,等待添加其它类型 文件。 执行“Tools”菜单下的“Options”命令,在弹出的对话框中选择“D

41、irectories ”属性页。在该属 性页下设置 Include 路径属性和 LIB 路径属性,分别将 MATLAB 外部接口应用程序的 Indude 路径 和 LIB 路径添加到这里。MATLAB 外部接口应用程序头文件所在的 Include 路径为 E:MATLAB6P5P1EXTERINCLUDE ,注意如果开发应用程序时使用了 C+语言,则还要将 E:MATLAB6P5P1EXTERNINCLUDECPP 路径添加到 Include 路径。在设置 LIB 路径时,需要根 据不同的编译器选择 LIB 路径,MATLAB 外部接口应用程序针对 MSVC+6 . 0 的库文件路径是 E:M

42、ATLAB6P5P1EXTERNLIBWIN32 MICROSOFTMSVC60。将上述的两个路径分别在如图 所示的对话框中设置完毕。 设置完毕后,单击“OK”按钮确认并退出 Option 对话框。向项目工程中添加必要的源代码文件, 如果用户的源代码文件不存在,则可以直接执行“File”菜单下的“New”命令,创建一个新的源代码 文件并将其添加到项目工程中去。如果需要添加的烟代码已存在,则执行“Project”菜单下的“Add to Project”子菜单下的“File”命令,在弹出的对话框中选择图的源代码文件: simpleengdemo.cpp。 图新建项目对话框 图 2-2设置必要的 I

43、nclude 路径和 LIB 路径 图选择源代码文件 单击“OK”按钮,将源文件添加到项目工程中。在进行编译之前,执行“Project”菜单 下的“Setting”命令,在弹出的项目属性对话框中,设置 Link 属性页中链接库文件选项, 将 libmx.lib 和 libeng.lib 两个文件添加到链接选项中,如图所示。 图添加必要的库文件 单击“OK”按钮之后确认,这时就可以直接生成可执行应用程序了。执行“Build”菜 单下的“Build simpleengdemo.exe”命令,如果应用程序没有任何错误,则 Visual C+将 生成相应的可执行文件,也可以在 Visual C+中直接

44、完成程序的运行 第三章第三章 Visual C+调用调用 Matlab 数学库数学库 前面实现了在 VC 中调用 MATLAB 引擎。这种方式不能脱离 MATLAB 环境,所有 操作都是基于 MATLAB 实现的。由于 MATLAB 是一个庞大的软件包,在所有运行上述 程序的计算机上都安装 MATLAB,从费用、维护等方便考虑是不现实的。更好的解决办 法是采用 MATLAB 提供的函数库来开发脱离 MATLAB 环境而独立运行的程序。与 MATLAB 引擎应用程序相比,VC 调用 MATLAB 数学库和图形库有几个明显的优点: 执行速度快; 内存需求小; 可以发布给没有 MATLAB 的用户使

45、用。 但它也有几个缺点: 用户不能够在基于 MATLAB 数学库和图形库的应用程序中使用 MATLAB 的函数 eval()和 input(); 不能调用图形句柄系统的函数; 不能调用 MATLAB 工具箱的函数; . MATLAB 中的一些方法在 C/C+中得不到支持,如“; ”,“ ”。 3.13.1 使用使用 MatlabMatlab 数学函数库的环境设置数学函数库的环境设置 调用 MATLAB C+ Math Library 中函数的 Visual C+源程序, 通过 Visual C+对其 进行编译。在集成开发环境中正式配置编译环境之前,首先必须完成 MATLAB 中动态链 接库的导

46、入工作。在 MATLABexterninclude 中存在 libmx.def , libmatlb.def , libmmfile.def 等定义文件。下面以安装在 E:MATLAB的 MATLAB 为例,介绍集成开发环境中编译 环境配置的几个步骤。其它具体情况做相应的处理。 (1)设置 MATLAB 中头文件(.h)及动态链接库文件(.dll)的路径,由集成开发环境中菜 单 Tools Options Directories。在 Directories 的 Show directories for 栏中首先选 择 Include files,再在 Directories 栏中分别加入 E:

47、MATLABextern include 和 E:MATLAB externincludecpp;然后在 Show directories for 栏中选择 Library files,再在 Directories 栏中分别加入 E:MATLABbin 、E:MATLAB externlib。 (2)定义预处理宏 MSVC,MSWIND。由集成开发环境中菜单 Project SettingsC/C+。在 C/C+的 Category 栏中选择 Preprocessor,然后在出现的 Preprocessor definition 栏中加入 MSVC 和 MSWIND 。 (3)设置运行时动态链

48、接库。由集成开发环境中菜单 Project settings C/C+。在 C/C+的 Category 栏中选择 Code Generation,然后在出现的 Use run-time library 栏中选择 Multithreaded DLL 。 (4)在完成(l),(2),(3)步骤之后,就可以建立工程了。不过在源程序中必须加上#include MATLAB . hpp ,并在编译程序之前 libmx.lib,libmatlb.lib,librnatpm . lib 和 libmmnle.lib 等文件添加到工程中。方法是从 VC+集成开发环境的菜单“Project” “Add to

49、Project”“Files ”弹出的 Insert Files to Project 对话框中,从目录 E:MATLABexternlib 中选择上述文件后按“OK ”按钮。 3.23.2 在在 VisualVisual C+C+中调用中调用 MATLABMATLAB 数学函数库数学函数库 下面我们在 VC + 的集成环境下进行程序设计,MATLAB C+数学库最大的应用 价值就在于脱离 MATLAB 环境运行,很少有人直接将其应用于 C+的计算程序开发, 大部分是重用 mcc 生成的代码。为了论述方便首先生成一个基于 C+的简单控制台应用 程序,然后在项目中将用 mcc 命令生成的 mat

50、sum.cpp 和 matsum.hpp 包含到项目中,这 是目前通用的做法。 首先讨论如何具体利用 Matlab 编译器从 m 文件生成 C+代码,并嵌入用户代码, 生成运行时不需 MATLAB 支持的应用程序。设 matsum.m 文件的内容如下: fonction sum = matsum(a,b) % sum sum=a+b 用 mcc 命令转换为 C+代码,命令行参数如下 生成 C+ 文件 mcc -t -L Cpp matsum.m 生成动态链接库函数 mcc -t -W lib:sum -T link:lib matsum.m 对生成的 C+文件进行分析,不难发现编译器根据 m

51、文件中的函数,生成一个对应 的 C+函数:static mwArray Mmatsum(int nargout_,mwArray a,mwArray b);并分别根据 C+和 Mex 文件的接口方式生成两种形式的接口函数:extern mwArray matsum(mwArray a=mwArray:DIN,mwArrayb=mwArray:DIN);和 void mlxMatsum (int nlhs,mxArray*plhs, int nrhs,mxArray*prhs );另外还有局部函数表声明 l 。 生成 C/C+代码后,在 VC +的 IDE 环境下进行程序设计。为了论述方便首先生

52、成 一个基于 C+的简单控制台应用程序,然后在项目中将用 mcc 命令生成的 matsum . cpp 和 matsum.hpp 包含到项目(project)中。如果该项目含有预编译头文件 StdAfx . h ,那 么在 matsum.cpp 所有包含文件之首加入include StdAfx . h ”。然后打开 Project/Setting 菜单,在 C/C+的 Category 中选 Preprocessor ,在预定义 (Preprocessor definitions )栏加入 MSVC , MSWIND , _STDC_ ,其中_STDC_可选。选 code Generation

53、 ,在运行时库(Use run-time library ) 栏中选择 Multithreaded DLL 。在 Link 的 Object/Libra modules 中添加库文件 libmatlb . lib ,limx.lib , libmatpm.lib 。当然对 于使用图形函数的程序必须使用相应的库。 例程如下: #include #include #include kf.hpp #pragma comment(lib,libmatlb.lib) #pragma comment(lib,libmx.lib) #pragma comment(lib,libmatpm.lib) #pra

54、gma comment(lib,odbccp32.lib) int main() mwArray a,c; coutplease put in a double:endl; scanf(%f,a); c=kf(a); getchar(); return 0; 总结总结 MATLAB 提供大量、丰富的应用函数,并具有容易扩充的开放性结构,已经成为各 个行业科研工作者的必备工具。但由于 M 语言是一种解释性语言,其应用场合和执行速 度都受到了限制。而 C 语言是一种高效率、能对硬件进行操作的高级语言。将两者的优 势结合起来,无疑给程序员带来了福音,使工作效率大大提高,开发周期明显缩短。因 此,本篇

55、论文有着很积极的现实意义。但是由于作者基础和时间有限,对题目探讨的深 度十分有限,仅在可行性(feasibility)层面上进行了论证,对于实质性的应用还要在以后的 学习和科研工作中不断实践。 附录附录 simpleengdemo.cpp 源代码 /*include required head files*/ #include engine.h #include stdio.h #include conio.h #define BUFFERLEN 256 /*main function*/ void main() Engine *ep; char cmdBUFFERLEN; int i=0;

56、int status=0; /*open engine*/ ep=engOpen(NULL); if(ep=(Engine*)NULL) printf(error:cant open Matla Enginen); exit(-1); /*perform Matlab instructions*/ engEvalString(ep,A=zeros(1,10);); engEvalString(ep,stem(randn(9),.);); engEvalString(ep,figure(2); engEvalString(ep,plot(1:10);); /*wait for a moment*/ printf(nplease look for result in Matlab conversation!); printf(npress any key); getch(); engEvalString(ep,t=clock;); /*perform other matlab instructions*/ for(i=10;i20;i+) /*prepare to perform instructions in Matlab*/ sprintf(cmd,A(%d)

温馨提示

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

评论

0/150

提交评论