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
书馆计算机管理及档案计算机管理等研究工作。
) ,男 ,副教授 ,博士 ,主要从事机械振动信号处
) ,女 ,馆员 ,主要从事图