logo资料库

C++实现小波变换.pdf

第1页 / 共2页
第2页 / 共2页
资料共2页,全文预览结束
2 计算机应用研究 2001 年 2 2 ·89·   在 Visual C + + 中不依赖 MATLAB 环境调用其函数的方法 杨建国 , 刘  然 (哈尔滨工业大学 (威海分校) 汽车工程学院 ,山东 威海 264209) 摘  要 : Visual C + + 是 Windows 平台下强大的应用程序开发环境 ,MATLAB 是一个功能强大的数值计 算和结果可视化的软件 。一种有效的将两者紧密结合起来的方法是 ,在 MATLAB 环境下利用 MATLAB 函数开发某些计算程序 ,将其编译成不依赖 MATLAB 环境的 C 函数 ,在 Visual C + + 中将此 C 函数编译 成动态连接库 ,然后在 Visual C + + 环境中开发应用程序界面等功能并加载所开发的动态连接库 。 关键词 : Visual C + + ;MATLAB ;动态连接库 中图分类号 : TP311. 11    文献标识码 : A    文章编号 : 1001 3695 (2001) 09 0098 02 The Calling Method of MATLAB Functions in Visual C + + without MATLAB Environment Support ( School of Auto Engineering the Weihai Branch of the Harbin Industry University , Weihai Shandong 264209 , China) YANGJian guo , LIU Ran Abstract : Visual C + + is a powerful developing environment of application program under Windows operating system. MATLAB is a powerful software of numeric calculation and result visualisation. One resultful method of combining Visual C + + and MATLAB is firstly to develop some calculation programs with MATLAB functions ,secondly to compile them to C functions which are independent of MATLAB environment ,thirdly to compile these C functions to DLL by Visual C + + ,and then to develop application GUI and loading the DLL in Visual C + + environment. Key words : Visual C + + ;MATLAB ;DLL 1  前言 MATLAB 语言具有以下主要特点 : (1) 编程简捷 , 接近数学表示和人类思维 ,被称为演算纸式的科学工 程计算语言[1 ] ,尤其是对矩阵的操作 ,直接 、快捷 ; (2) 计算结果可视化功能强大方便 ; (3) 具有强大而开放的 工具箱 。 这些突出的特点已引起了科技 、教育和工程界的 广泛兴趣 。同样的算法 ,利用 MATLAB 开发的程序 ,比 利用 C 及 Fortran 语言开发的程序要简练许多 ,开发时 间也要节省许多 。 Visual C + + 是 Windows 平台下主要的应用程序开 发环境之一 ,基于 Visual C + + 几乎可以开发 Windows 应用的各个方面[2 ] ,从底层软件一直到直接面向用户 的软件 。在 Visual C + + 环境下 ,可以开发出功能高效 强大的 Windows 应用程序 。 比较 MATLAB 和 Visual C + + ,它们互有长处 ,而 且可以互补 。MATLAB 编程简捷方便 ,有强大的函数 库和工具箱支持 ,MATLAB5. 3 版本遍及了 31 个工程领 域 ,但是其应用程序界面的开发远不如 Visual C + + 方 便强大 ;另一方面 ,对于较大的循环 ,其效率也不如 Vi sual C + + ; Visual C + + 在工程计算方面 ,编程要比 收稿日期 : 2001 01 14 MATLAB 烦琐得多 。 将 MATLAB 和 Visual C + + 结合起来 ,取长补短无 疑是一个有效的途径 。结合的方法有以下几种 : ①是 在 Visual C + + 中启用 MATLAB ENGINE (引擎) ,通过 MATLAB 的应用程序接口 (API) 中有关 MATLAB EN GINE 的函数[3 ] , 编程者可以在 Visual C + + 中调 用 MATLAB 函数 ,但这种方法要同时启用 MATLAB 环境 , 因此要求系统中必须安装 MATLAB ; ②是利用 MATLAB COMPILER ( 编 译 器 ) , 将 MATLAB 函 数 编 译 成 脱 离 MATLAB 环境的可执行程序 (. exe 文件) ,在 Visual C + + 中调用 ,这种方法简单 、方便 ,但运行时要出现一个 控制台窗口 ,另外 ,函数的输出参数难以直接连接到 Visual C + + 的函数中 ; ③是本文将要介绍的方法 ,即 利用 MATLAB COMPILER(编译器) ,将 MATLAB 函数编 译成可以脱离 MATLAB 环境使用的 C 函数 ,在 Visual C + + 中将此 C 函数编译成动态连接库 ,在 Visual C + + 中加载这个动态连接库 ,这种方法能实现两者之间的 无缝连接 ,仅需利用相关的 MATLAB 应用程序接口 (API) 函数编写一个 C 语言的接口函数 。 2  将 MATLAB 函数编译成脱离 MATLAB 环 境使用的 C 函数的方法   将 MATLAB 函数编译成可以脱离 MATLAB 环境使 用的 C 函数的方法很简单 ,方法如下 : (1) 在 MATLAB 环境编写数值计算程序 (假定文件
2 2 2 1 ·99·    2 杨建国等 :在 Visual C + + 中不依赖 MATLAB 环境调用其函数的方法 第 9 期 名为 fname. m) ; (2) 利用命令  mcc t fname. m 将 MATLAB 函数编译成 C 函数 ;编译完成后 ,将产生如 下几个文件 : W lib :fnamelib L C fname. c      fname. h fnamelib. c fnamelib. h fnamelib. exports 3  建立动态连接库 在 Visual C + + 6. 0 中 ,将上面产生的 C 函数转换 为动态连接库 ,可按下面方法进行 : (1) 在 Visual C + + 6. 0 中建立一生成动态连接库 的工程 fntest 。 (2) 将 fname. c 和 fnamelib. c 加入工程 fntest 中 。 (3) 利用 MATLAB API 函数编写一个调用 MATLAB 函数 mlffname () (位于 fname. c 中) 的 C 函数 (假定名为 fnamewrap. c) , 并 将 其 加 入 所 建 立 的 工 程 fntest 中 ; fnamewrap. c 中应包含两个头文件 : fnamelib. h ,matlab. h。 (4) 编写文件 fntest. def ,并将其加入工程 fntest 中 。 fntest. def 文件的内容如下 : LIBRARYfntest. dll EXPORTS fnamewrap (5) 将“MATLAB 安装目录 \ extern \ include \ ”下 的文件 libmx. def ,libmatlb. def ,libmcc. def 和 libmmfile. def 加入工程 fntest 中 。 (6) 分别对四个 def 文件进行设置 lib / def :“MATLAB 安装目录 \ extern \ include \ xxxx. def”/ machine :ix86 / OUT:xxxx. lib 其中 ,xxxx 分别代表 libmx ,libmatlb ,libmcc 和 libmmfile , 设置的方法是分别在 libmx. def ,libmatlb. def ,libmcc. def 和 libmmfile. def 上点击鼠标右键 ,选 setting 项 。 (7) 其它设置 设置工程 fntest 的主文件 :选中 C/ C + + 菜单 ,选 取 Gategory 下的 Code Generation 项 ,将 Use Runtime li brary 设置为 Multithreaded Dll ;再选取 Gategory 下的 Pre processor 项 , 在 Preprocessor definations 中 加 入 MSVC , MSWIND ,IBMPC。设置 Tools 菜单下的 options :选中 di rectories ,加入 MATLAB 安装目录 \ extern \ include \ cpp 和 MATLAB 安装目录 \ extern \ include ; (8) 编译连接 ,生成动态连接库文件“fntest. dll”和 伴生文件“fntest. lib”。 4  在 Visual C + + 6. 0 中调用 fntest. dll 在 Visual C + + 6. 0 中调用 fntest. dll 的方法与其它 动态连接库文件完全相同 。要注意的一点是 ,需要在 调用 fnamewrap () 函数 (fntest. dll 的接口函数) 的文件中 声明该函数的一个外部调用 。 5  应用举例 笔者成功地将许多利用 MATLAB 环境及其工具箱 开发的 MATLAB 函数 ,利用上述方法生成了动态连接 库文件 ,并在 Visual C + + 6. 0 中调用 。下面给出一个 作快速傅立叶变换 (FFT) 的例子 。限于篇幅 ,这里只给 出关键的动态连接库接口函数 。 在 Visual C + + 6. 0 中编写的接口函数 yfftwrap. c stdcall yfftwrap (double x , int fs , int k) x p 1 ; x p 2 ; y p ; 如下 : # include ″yfftlib. h″ # include ″matlab. h″ double { mxArray mxArray mxArray double x p1 = mlfDoubleMatrix(1 ,k ,x ,NULL) ; x p2 = mlfScalar (fs) ; y p1 = mlf Y fft (x p1 , x p2) ; y = mxGetPr (y p1) ; return y ; } y ; 在 Visual C + + 6. 0 中加载 fntest. dll ,并在调用函 数 yfftwrap () 的文件中声明 extern ″C″double k) ; stdcall yfftwrap (double x[ ] , int fs , int 6  结束语 利用动态连接库的方法 ,将 Visual C + + 和 MAT LAB 紧密地结合起来 ,是一种非常有效的方法 。它充 分地利用了 MATLAB 强大方便的数值计算能力和 Vi sual C + + 的强大图形界面功能 ,并使程序的效率相当 C 程序 ,使软件的开发时间大为缩短 。 参考文献 : [1 ] 张培强. MATLAB 语言[M] . 合肥 :中国科学技术大学出版 社 ,1995. [2 ] David J Kruglinski ,Scot Wingo , George Shepherd Visual C + + 6. 0 技术内幕 (第五版) [M] . 希望图书创作室. 北京 :北京 希望电子出版社 ,1999. [3 ] MATLAB Application Program Interface Guide ,version 5 [ M] . MathWorks ,1998. 103. [ 4 ] 吕延庆 ,朱建民 ,周福章 ,等. 基于 Visual C + + 和 MATLAB 的联合编程方法的研究 [J ] . 计算机应用研究 ,2000 ,17 (11) :101 作者简介 : 杨建国 (1964 理、故障诊断等研究工作 ;刘然 (1963 书馆计算机管理及档案计算机管理等研究工作。 ) ,男 ,副教授 ,博士 ,主要从事机械振动信号处 ) ,女 ,馆员 ,主要从事图
分享到:
收藏