一 种VC++与 MATLAB混合编程的实现方法
王安红 孙志毅
(太原重型机械学院 太原 03~24)
摘 要 本文介绍了MATLAB和Vc++混合编程的三种方式,研究了采用“调用 MATLAB C/C++库”方式时,其动态链接库的导入
与设置,静态链接库的生成与设置,编译环境的设置,数据类型转换等一系列问题,为用户扩展 MATLAB应用,方便快捷的实现
MATLAB与Vc++混合编程,提高编程效率提供有益的帮助。
关键词 动态连接 编译环境 数据转换
A MEⅡICID oF HYBI P】 GR AMM G B】阴 哑 N M ILAB AND VC++
Wang Anhong Sun Zhiyi
(Ta/yuan Heavy dl ,y lnst/mte,Taiyuan 030024)
Abstract In this paper.three hybrid programming ways between MATLAB and VC++ are introduced.In the case of using MATLAB C/ C++
library,the producing and setting of Static Link Library,the setting of Dyngmic Link Library(DLL)and compiling environment and the conversing
of the data type are studied.It is hdpf~ for user to extend the application of MATLAB and to improve the efficiency of programming.
Keywords Dyngmic link Compiling environment Conversion of data
0 引 言
MATLAB是美国Mathworks公司推出的一种以矩阵为基本
编程单位的高效数值计算语言,它集科学计算、图形处理、自动
控制、信号处理、神经网络等于一体 ,受到许多学科的青睐,是
目前在工程应用中使用极为广泛的一种软件。然而,作为一种
以解释方式运行的高级语言,MATLAB的执行效率较低。为此,
M公司提供了 MATLAB和 C的接口,通过接口,用户能实现 C
与 MATLAB的混合编程,从而实现既有强大的数值计算功能又
有高度的执行效率的愿望。目前也有一些文献对 MATLAB与
vc++的混合编程进行了研究,如文献[2,3],但它们对编译环
境的设置,动态链接库的生成与链接,特别是对混合编程中的
数据类型转换没有进行专门研究。本文将根据混合编程的实
际应用,研究总结混合编程的方法,环境配置与数据类型转换
等问题。
一 般来说,MATLAB与 c混合编程共有三种方式⋯:(1)调
用MEX文件;(2)利用 MATLAB引擎函数;(3)利用 MATLAB
C/C++数学函数库调用 MATLAB函数。其中方式(1)(2)需依
靠 MATLAB环境支持,而(3)可以脱离 MATLAB环境独立执行,
这一优点使方式(3)成为 MATLAB接口方式中作为常用的也是
最具效率的接口方式。由于(3)的最大缺点是不能利用 MAT-
LAB丰富的图形句柄,这使(3)更适合于需要进行大规模数值,
矩阵计算而没有图形输出的场合。当然,我们在分析性能、需
要画图的场合,亦可利用(2)启动 MATLAB引擎 ,通过调用其绘
图命令来实现 ,这样可弥补(3)的不足,使程序更趋完善。笔者
· 12 ·
在用神经网络进行语音信号的非线性处理过程中,为了利用
MATLAB强大的矩 阵处理功能,通过方式 (3)调用 MATLAB
C/C++库编写神经网络仿真程序,使程序更精练简洁,又用方
式(2)编写一专门绘图软件,在需要的场合调用,这使整个程序
既有效率又功能丰富。本文将主要介绍用方式(3)实现 MAT-
LAB与VC++混合编程中的问题。
1 库文件的生成和设置
方式(3)虽可独立于 MATLAB环境而独立执行,但此“独
立”是建立在动态或静态链接库之上的,如当发行基于vC++
6.0的 MATLAB C++数学库应用程序时,必须附带vC++6.0提
供的两个动态链接库 MsvcRT.DLL和 舱Ⅳ伽 .DLL。对在编
译过程中需要的几个静态链接库文件用户亦必须指明其所在
路径。这种动静态连接从一定意义上也反映了利用多软件联
合编程的特点,这在VC++集成环境中是很容易实现的(当然
它亦有其优缺点,详见[4],不在本文讨论范围之内)。对动态
链接库的设置可在VC++工作窗口中,选择菜单 PROJECI"一
SETII~G—CATGORY—CODE GENERATION,在 USE RUN—TIME
LIBRARⅥ栏 中选 MULTrIHREAD DLL即可;对几个静态链接厍
文件 libmrr~e.1ib,libmcc.1ib,libmmlh.1ib,lihnx.1ib,libnlat.1ib,
libeng.1ib,libmatpm.1ib,应该在工程文件中将其添加进去,具体
步骤在编译环境的设置中所述,需要注意的是:其中有几个静
收稿 日期.'2002—03—2o。王安红。讲师,主研领域:语音信号处理。
神经网络。
维普资讯
态链接库文件事先并不存在,只在其 DEF文件中对其格式进行
了定义。若此,我们可利用 DOS命令框中的LIB命令生成。以
LIBMCC.LIB库文件的生成为例,具体格式为:
lib/deft·cj|matlabrlJ|emtcm |imlu& t libmcc ldef/ma-
chine:ix86/out:libmce.1ib/nologo).对静态链接库文件,一旦生成
后就可反复使用,无须对每一个工程进行重新建立。
2 编译环境的设置
由方式(3)调用 MATLAB c++源程序,将它编译成可执行
程序共有二种方式-1 J:一种是通过rebuild命令;另一种是在集
成环境中直接完成。其中第一种方式虽然配置起来较方便,但
因rebuild命令没有提供相应的应用程序调试功能,随用户对应
用程序的不断修改,其编译工作需不断重复,造成不必要的麻
烦,所以这种方式比起第二种方式来说并不可取。我们将主要
介绍第二种方式:在集成环境下编译环境的配置,其中以删
工程文件的建立为例为说明,具体步骤如下:
(1)工程文件的建立 进入Microsoft VC++6.O集成
环境,选择 Fde—New菜单,选 Win32控制台程序,建立一个空
的名为 M的工程文件。
(2)头文件及链接库文件的路径设置 选择下拉
菜单 Tools-Options-Directories-Show directories for,分别在 Include
Files栏和 libraryFiles栏中加入 c:、matlabrl1、~xtem、include,
c |watl#~rll I eXtern|lib,c |matlabrl1|~xtem |include|cpp
(3)预处理宏的定义 在菜单Project-setting-catgory-
preprocessor-degmifion栏中加入宏名 MSVC,MSWlND.
(4)静态链接库文件的添加 在Project-Add to Proj~
一 Files-Insert Files to Project框中,加入c:、matlabrl1、extem、lib
\目录下的静态库文件:libw,~!e.1ib, .1ib,liimmtlb.1ib,lib.
nix.1ib,libmat.1ib,libmatpm.1ib,libeng.1ib.
(5)YY13M源程序的编写 在源程序中加上包含文件
静include“matlab.hpp”后就可调用 MAqI.AB C++库函数具体进
行应用程序的编写了。
3 数据类型转换
编译环境的正确配置只是为 MAq3_.AB与vc++混合编程作
好了铺垫,要真正实现 MATLAB与VC++混合编程,必须搞清楚
两者的数据类型以及两者数据类型的相互转换方法。一般来
说,数据转换包括两方 面的转换:一是C++语言数据类 型到
MAq3_.AB C++数学库数据类型的转换;一是从 MAq3_.AB c++数
学库 到 c++语 言 的转换。这两方 面 的转 换在 MATLAB与
VC++接口的三种方式中分别有不同的命令,有不同的实现方
式,在运用时都必须搞清楚。但对这三种混合编程,其数据转
换的共同点是两方面的互相转换即数据转换思想一直贯穿于
混合编程的始终。本文主要总结采用接 口方式(3)时的数据类
型的相互转换。
(1)MATLAB C++数学函数库数据类型及其创建
为了方便线性代数算法的开发,MAq3_,AB c++数学函数库
中,定义了大量的类和函数,其 中最为重要的和最为基础的类
就是类 mwArray,它相对应于 MAq3_AB中的阵列数据类型。它是
MAq3_,AB Vc++数学函数库 中最为基本的数据类型,也是使用
MAq3_,AB C++数学函数库的关键⋯。用户可以通过创建阵列
对象即mwArray类对象来实现对 MAq3_AB C++数学库函数的
调用,以实现矩阵运算。在 MAq3_AB C++数学函数库中,通过
类 mwArray对五种类型的 MAq3_AB阵列提供了支持,分别为数
值阵列,稀疏矩阵,字符矩阵,单元阵列和结构体阵列,它们有
不同的创建方法与命令。对常用的数值阵列对象的创建,可通
过使用类 mwArray的构造函数来定义,以下重点总结。
在类 mwArray中,共有 18种构造函数-1],最常用的构造函
数有:① mwA~y A;② mwArray(int),mwArray(double);③ mwAr-
ray(int,int,double*,double*),m~,XnW(im,im,im *,iI吐*),
mwArray(int,int,unsi ed short*,um~cd short*);④ m
(mwArray*)。其中①中的构造函数可创建一个未初始化的数
值阵列对象,如mwArray A;②中的函数可将输入的单个的双精
度实数和整数创建为 1*1的数值阵列对象,如 A=m、 (1.
40),创建了1*1的数值阵列A,其值为1.40;③中的函数可创
建指定行数和列数以及实部和虚部数据的数值阵列对象,它是
c++向MATLABc++库数据类型转换最常用的方式 ,如通过
以下代码:
int I;
im P;
p=new int[6];
fo~(i=O;I<6;I++)
*(P+I)=I;
mwArray C(2,3,p)
可产生阵列 C=[0 1 2 3 4 5];
④中函数可 以通过现有 mwArrgy类对象来创建阵列对象,如
D(C),则D=[0 1 2 3 4 5]
另外,对数值阵列创建函数如 ones(),ran&()等,其用法与
MATLAB中相应函数用法相同,只不过数据类型为 mwArmy类
对象,不再赘述。
(2)由C++到 MATLAB C++的数据类型转换
由(1)可看出,由C++到MATI_AB C++的数据类型转换,关
键是实现将c++中数据类型转换为 raw.ray类对象阵列,主要
通过(1)中②和③中的几个函数,举例如下:
double pl, p2;
pl=rlew double[6];
p2=rlew double[12];
for(I=O;I<6;I++)
*(pl+I)=(double)*(ppl+I); //ppl:c++中float型指针变量
mwArray口rIl(2,3,p1);
f (I=O;I<12;I++)
*(p2+I)=(double)*(pp2+I); //ppl:c++中指针变量
m ~m2(3,4,p2);
mW_. ray em3;
cm3=anl*cm2; ∥实现矩阵乘法
delete pl,pl;
(3)由MATLAB C++类型到C++类型数据转换
这种转换主要实现类 mwArray对象中数据的提取。在类
mwArray中提供了若干个数据提取成员函数,主要有 GetData(),
B血 ts瑚ar(),ExtraetData(),ToS~mg()等。因 GetData()容易导
致内存泄露,一般不建议使用。对数据类型的阵列对象一般常
用 Ex昀ctsca】ar(),ExtmetData()来完成,对字符型阵列可用 I10s_
(下转第 77页)
· 13 ·
维普资讯
采用常规的滤波和去噪,控制则是以PID为核心的算法。今后
传感器仍朝着集成化、多功能智能化传感器发展。智能型仪器
仪表和智能控制器能方便联网,有利于组成开放式 SCADA系
统。
2网络传输介质技术
监控系统是通过传输介质来传递信息的,传输介质传递信
息的速度越快 ,监控系统的响应就越灵敏 ,传递的信息也就越
多。传输介质从双绞线 、同轴电缆、光缆到视野内信号(微波、
红外线)及卫星通信等,实现从有线到无线发展,也促进了监控
系统的发展。
3开放式综合网络监控管理系统
90年代以后网络技术发展到第四阶段,即网络电脑和信息
高速公路网络阶段,计算机网络系统本身就是一个极其庞大又
复杂的综合网络系统,本身就需要一个综合网络监控管理系
统。第四代综合网络监控系统中包括大范围的环境图像监控
系统、设备监控系统、商业金融服务监控系统等。这种新一代
综合网络监控管理系统可以是几个监控系统组成,它们可以连
接到一个总线网、环形网或星形网,而且网上节点可以增加或
减少;也可以是单独的一个庞大的监控系统。几个监控系统可
以是平等的,也可以是分层的,采用什么样拓扑结构,设计者根
据具体情况决定。
4计算机监控系统集成
计算机系统应用水平不断提高,计算机硬件、软件及网络、
数据库等技术的发展,一个新的概念正在逐渐被人们接受和认
可,这就是计算机系统集成(System Integration简称 sI)。计算机
系统集成是根据应用需求,将硬件、网络、数据库及相应的应用
软件组合成为有效可用的、具有 良好性价比的计算机应用系
统。它具有(1)支撑系统的集成;(2)应用功能的集成;(3)综合
技术的集成 ;(4)多种产品设备的集成等。
5无线综合监控系统
基于 CDPD(Cellular Dislt~Packet Data)的无线上网、移动办
公、移动炒股、无线刷卡支付、无线记者站、远程环境监控及全
球卫星定位系统(GPS)在车辆定位监控调度等交通运输和道路
工程的应用。无线综合监控系统和温度控制装置正在形成,该
(上接第 l3页)
tring()来完成。另外需注意的是函数 ExtractScalar()在执行时,
将一个 M*N的阵列视为一个 1*(M*N)的阵列,而通过 E】【.
tractData()可将 mwArray类对象数据拷贝到指定的C++数组中。
举例~l-V(ppl,plp2,cml,cm2与上述(2)中一致):
double mcl;
mcl=new double[6];
(I=O;I<6;I++)
{
*(mcl+I)=cm1.ExtractScalar(I+1); ∥用 ExtractScalar()进行数
据提取
*(ppi+I)=(no~)(mcl+I); ∥转换为c++中float类型
}
double*hr.2:n double[3*4】;
cm2.Extra.Data(me2); ∥用 ExtractData()进行数据提取
(I=O;J<12;I++)
*(pra+I)=(float)*(hr.2+I) ∥转换为float类型
系统采用无线传送,声光报警、中央控制、自动化管理。
6聚类融合控制理论
目前,提出了一种新型的智能监测控制方法——信息融合
的聚类控制(简称聚类融合控制),不是象常规控制那样直接利
用传感器的检测数据经过某些控制算法后进行控制,而是融合
多个传感器数据并聚类成反映过程运行状况的类别,根据每一
类别所描述的过程行为特点采取相应的控制策略进行控制的
方法。它与模糊控制结合又形成了“模糊聚类融合控制”等新
的理论 。
然而,计算机监控系统也存在安全性及某些设备使用范围
的局限性等问题;在软件方面,通常采用标记检查、多级口令设
置、信息加密等技术,识别系统对自身文件和用户文件的存取
合法性 ;在信息上加载编码等技术进行巡检、保密通信来增强
系统自诊断、自恢复、自动切换等能力,以防通信线路被切断或
受占线及其它干扰,保证系统的异常处理和系统的安全性等。
从计算机技术和 自动控制技术发展状况来看。高性能控制
机系统、智能控制系统和基于网络系统的虚拟企业自动化系统
将是未来自动化的重要发展方向;随着迅速发展的智能型传感
器、执行器 、传输介质等设备的发展及新型计算机系统研制,
如:知识信息处理系统,人工神经网络计算机、光计算机 、生物
(DNA)计算机等新型计算机的研究和新的监测控制理论方法
的发展,计算机监控系统朝着智能化、网络化 、微型化、集成化、
无线化的方向发展。
参 考 文 献
[1]周德泽 袁南儿、应英,计算机智能监测控制系统的设计及应用
[M].北京:清华大学出版社,2O02.
[2]钟才杰 、虞鸿,“计算机监控系统的应用和发展”,《电世界》,1998
(11).
[3]王晓穗,“计算机网络监控系统的应用与发展”,《信息化》,2OOO
(12).
[4]李文、曾明志等,“区域联网报警 自动监控系统软件设计与实现”,
《广西科学院学报》,.2001(3).
[5]Tom M.Mitchel1.MACHINE~ NG[M],Bo6toll:McGraw-Hill,1997.
4 结束语
为了提高编程的效率和水平,需最大限度地利用各种软件
的特长。通过VC和 MATLAB的混合编程,可将难度很高的复
杂算法研究与实际的应用结合在一起 ,使程序简洁,编程效率
提高,算法更容易实现。
参 考 文 献
[1]刘志俭,MATLAB应用程序接121用户指南,科学出版社,2OOO.
[2]储开颜、严利民、王朔中,“Vc与 MATLAB的接 121及其实现”,《计算
机工程》,2o0o(12).
[3]石波、陈淑珍、沈海鸥,“Vc与 MATLAB接口方法的剖析”,《计算机
工程》,2ooo(3).
[4]王世同、李强,VISUAL c++6.0编程基础,清华大学出版社,2OOO.
· 77 ·
维普资讯