胡 静 吴 云 张 燕
(1)中国地震局地震研究所,武汉 430071 2)中国地震局地壳应力研究所武汉创新基地,武汉430071)
基于COM组件的VB与MATLAB混合编程技术在地形变数据分析中的应用*
胡 静1,2)吴 云1,2)张 燕1,2)
(1)中国地震局地震研究所,武汉 430071 2)中国地震局地壳应力研究所武汉创新基地,武汉430071)
介绍一种基于组件对象模型(Component Object Model,COM)的VB与Matlab混合编程技术,以作者开发的地形变处理软件数据处理模块为例,阐述基于COM组件的VB与Matlab的混合编程在地形变数据处理中的应用,论述如何实现VB与Matlab数据的互调。集成后的软件不仅能够充分发挥两种语言各自的优点,还可以完全脱离Matlab的运行环境。
VB;Matlab;COM组件;混合编程;地形变
地形变观测是监测地壳运动与变形、认识地震孕育过程和开展地震预测的重要手段之一。目前已具有多种方法,并形成一定规模[1]。地形变数据是地震学中最基础的资料之一,对于地形变数据的预处理往往需要大运算量的矩阵计算以及对分析结果进行实时、直观的图形化显示,一般采用Matlab等第三方数据处理软件进行分析[2]。Matlab是美国MathWorks公司开发的大型数学计算应用软件系统,用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境,在地形变数据处理领域应用广泛。然而,Matlab自身所存在的某些缺点限制了它进一步的应用。首先,Matlab是一种解释性语言,实时效率相当差,特别是在循环计算中;Matlab的界面开发能力较差并且不能脱离其环境运行;而Matlab程序的源代码可以被直接看到,因而不利于算法和数据的保密。
VB是Windows操作系统下优秀的可视化编程语言,在用户界面设计和快速开发等方面具有独特的优势。从VB5.0版本开始,可以编译链接生成本机代码的可执行文件,能够脱离VB的集成开发环境进行发布,较好地封装了用户的算法,有效地保护了用户的源代码。然而,VB只提供了基本的数学函数库,对于开发需要进行各种滤波和小波变换[3]的地形变数据分析系统来说,远远不够。这种情况下,如果使用基本函数库编写特殊功能的数学函数库,不仅要求用户对算法有深入的理解,而且费时,还可能因为在设计和运行时的错误处理机制的欠缺,难以保证每个函数功能的正确性。
如果能在地形变数据处理软件的开发中集成VB和 Matlab各自的优点,把数据分析功能留给Matlab完成,而用VB语言编写Windows应用程序,对计算结果进行分析和可视化处理,将极大地提高程序的开发效率。文献[4]采用ActiveX技术开发的基于VB与Matlab前兆资料小波分析程序,该程序需要Matlab在后台运行,无法脱离Matlab环境,应用推广有一定的局限。另外,程序中的绘图操作等都由Matlab来完成,速度比较慢,绘出的图形其实已经是Matlab保存的图形文件,可操作性受到限制。本文采用基于COM组件的VB与Matlab混合编程思路,提出利用Matlab将输出数据传输给VB绘制图形的设想,实现数据的可视化分析,以提高数据分析的效率并实现软件脱离Matlab环境运行。
目前,比较成熟的VB和Matlab接口编程方法有如下几种:
1)ActiveX技术和动态数据交换(DDE)技术。这两种方法最大的缺点是不能脱离Matlab工作环境。2)可执行文件技术,是将Matlab运算模块做成可执行文件,然后在VB中进行调用。这种方法的缺点是需要单独开发可执行文件。3)利用Matrix-VB。MatrixVB是MathWorks针对VB提供的一个Matlab库,提供了一些专门固定函数。MatrixVB虽然能方便地实现VB和Matlab接口编程,但需要额外安装MatrixVB,并且提供的函数有限。4)COM组件技术。它是利用Matlab工具Matlab COM Builder将M文件转换成dll,然后在VB集成开发环境中直接调用该dll[5-7]。在上述方法中,前两种方法调用过程较复杂,且无法脱离Matlab环境,这直接影响了所开发软件的独立运行和发布。第三种方法虽然能够脱离Matlab环境,但MatrixVB软件已停止发行,而且功能函数也有限。为解决与其他应用程序之间的接口问题,MathWorks公司在其2002年推出的Matlab6.5中新增了Matlab COM Builder模块,它提供了一个简单易用的图形化用户界面,帮助用户将Matlab的M函数文件自动、快速地转换为独立的进程内COM组件,以.dll(ActiveX DLL)形式被装入到客户的进程空间中,使软件的不同部分按照一定的面向对象的形式组合成可以交互的过程和一组支持库,可以在任何支持COM组件的应用中使用[8],例如Visual Basic、Excel、C/C++语言等。其优点在于外部程序访问该COM组件时,没有必要进行环境切换,因此可获得最快的运行速度,并且可脱离Matlab环境运行。
使用COM Builder创建COM组件之前还需要对Matlab Complier进行必要的配置,方法为:在Matlab命令窗口中键入mex-setup,将出现选择编译器的提问,列出的计算机中已经安装的各种C/C++编译器,选择Microsoft Visual C++6.0,安装和配置完成之后,就可在Matlab中创建COM组件。先编写M函数文件,在M函数文件中,给出要求Matlab完成的功能,函数文件能够接收参数,也允许返回参数,需注意M文件的文件名必须和函数名一致。接着在Matlab中点击Start,选择Matlab/Matlab Builder NE/Deployment Tool,接着选择File/New Deployment Project,弹出对话框如图1所示,选择通用COM组件(Generic COM Componet),并对所建工程命名等。
新建工程后单击工程中的Add file,添加已经编写好的M文件,另外在编译之前先对编译选项进行设置,单击Project/Settings,在Package子选项中选择INCLUDE MCR,这样就可以脱离Matlab环境,不过也会引起编译速度变慢。选择Build project,无错误后单击Package,得到所需要的COM组件dll文件等。
Matlab生成COM组件后会在目标工程目录生成distrib文件夹,包含了表1所示的几个文件。至此,用户编写的M函数文件已转换为COM组件对象。
图1 Matlab创建COM组件Deployment Tool窗口Fig.1 Deployment tool for COM builder in Matlab
表1 应用COM Builder生成的文件Tab.1 Files resulted from COM builder
如果VB开发的软件是在本机上使用,则只要在VB工程的引用中添加编译好的dll文件即可,如果要发布给其他计算机使用,除了在编译时勾选“Include MCR”外,还要将创建成功的COM组件注册到使用它的目标计算机上。注册的方法是将上述distrib文件夹拷贝到目标计算机上,执行自解压可执行程序<componenetname>.exe,通过自解压程序安装工程打包好的文件,完成后在VB中引用dll文件即可。如果编译好的dll文件名称为componetname_1_0.dll,在VB工程中引用后需按照以下步骤来调用Matlab文件:
……
Dim MyClassName As componetnameclass
Set MyClassName=New componetnameclass
Call MyClassName.comFunction(n,A,B,……)
……
componetname_1_0.dll文件在默认的情况下引用后会出现componetnameclass类,用Dim as来声明该类,并用New来创建实例。使用Matlab COM组件所包含的函数时,使用 Call命令,设函数名为comFunction,则用指令Call MyClassName.comFunction(n,A,B,…)来调用目标函数,n为函数输出变量的个数,为整数类型,后面A,B等为函数返回值(函数运算的输出)和输入参数,按照M文件中函数的设定顺序依次输入,先输入返回值,再输入参数。
在地形变数据分析中,比较常见的是数据去固体潮趋势。我们采用VB编写用户界面并以之实现各种可视化功能,将数据分析交由Matlab完成,开发出可推广使用的地形变数据去趋势软件。在Matlab中编写的去趋势M函数文件命名为nakipoly.m,采用的是一般多项式拟合思路,使用Matlab自带库函数polyfit求出多项式拟合系数,polyval求出目标多项式,创建函数:function[nakiadata,enkidata]=nakipoly(Tomatdata,ord,datab,datad),其中nakiadata与enkidata为输出参数,分别是多项式拟合数据及与标准值差值数据,输入参数中Tomatdata为原始数据,ord为多项式拟合阶数,datab和datad分别代表数据的起始值与结束值,输入参数都由VB构造,可以在软件界面中实现对目标函数输出的控制,函数完整源代码如下:
由于VB无法识别Matlab生成的数组,最后几条指令在Matlab中生成顺序文件,VB可以直接读取:
fid=fopen('C: akitemp.txt','w');%打开文件
fprintf(fid,'%f ',nakiadata);%输出数据到文件fclose(fid);
M文件中的输入参数Tomatdata由下列步骤给出:
Open<filePath>For Input As#1‘filepath为目标数据文件对应路径
For I=0 To N-1
Input#1,Matdata(I)
Next
Close#1
程序通过用户的输入确定数据起始(datab)和数据结束位置(datad)后生成Matlab调用的数组Tomatdata:
For I=datab To datad
Tomatdata(I-datab+1)=Matdata(I)
Next
输入参数都确定之后便可以调用Matlab函数,在VB中调用目标函数代码如下:
绘图的部分由VB来完成,在VB中使用Open<pathname>For Input As#1代码可实现VB调用Matlab生成的数据,pathname为Matlab函数中对应路径,这样可以将数据传输给VB,方便使用VB的绘图功能,可提高软件处理效率并进一步实现更详细的图形操作。下面介绍软件的实际操作示例。图2为台站地形变数据处理软件主界面效果图。
图2 台站地形变处理软件主界面Fig.2 Main interface of crustal deformation data processing software
在进行数据处理之前,需要将从台站下载过来的固体潮数据放在软件当前目录文件夹“$Data固体潮数据”下,并且数据文件命名需要形如“63027_玉树_2322_20090101_20100413CP.txt”格式,63027为台站编码,232为钻孔应变仪标识,2代表第二分量,20090101_20100413CP代表日期,标识码之间用下划线隔开。在主界面中选择目标台站后点击“确定”,调出的数据分析模块如图3所示。
图3 数据处理模块界面Fig.3 Module interface of data processing
在台站选择列表中单击目标台站名称,文件列表中可以直观的看到当前台站所对应的所有文件,选择处理时间方式,绘出原始数据波形并进行去趋势分析,结果对应图形如图4。
图4 固体潮数据去趋势处理结果Fig.4 Results of detrend tidal data
图4中,第一个图为原始数据图,我们选取的是2009-01-01—2009-10-31玉树台钻孔应变仪第二分量数据;第二个图即为其9阶去趋势图,阶数的选择可以在右上角下拉选择,我们提供了5~9阶多项式拟合阶数;第三副图中的-690~690区间内曲线即为原始数据与多项式拟合的差值比较值,此区间外曲线是差值超过样本标准差的部分。通过误差标记按钮来控制其显示与否,点击异常标记可以返回主窗口并在当前台站上标记异常,方便工作人员进行分析。以上操作如果采用的是Matlab直接绘图则相对比较繁琐。异常标记图如图5所示。最后通过测试,可以在无Matlab环境的目标计算机上实现本软件的运行。
图5 异常标记Fig.5 Abnormal marker
介绍了通过COM技术实现Matlab与VB混合编程技术。介绍的地形变数据作固体潮去趋势分析模块,只是一个简单的示例,但仍能感受到使用COM组件后给VB和Matlab混合编程所带来的便利。VB与Matlab混合编程是一种快速构建系统可靠性与维修性仿真程序的方法,系统功能超越了单一编程语言所能达到的水平,而开发难度和开发时间却大大降低。这种方法实现了VB的可视化界面与Matlab强大函数库的有效结合,可缩短开发周期,提高软件性能。
1 牛安福,江在森.我国地形变观测预报地震的现状及对地震预测问题的思考[J].国际地震动态.2005,(5):174-178.
2 吕永清,蔡亚先,程骏玲.国家数字地震台数据处理研究[J].大地测量与地球动力学,2006,(3):131-134.
3 张燕,等.小波分析在地壳形变资料处理中的应用[J].地震学报,2004,26(增刊):103-109.
4 张卫华,等.基于VB/MATLAB的前兆资料小波分析程序的实现[J].地震地磁观测与研究,2006,27(2):93-99.
5 徐军辉.MatrixVB——基于 M atlab与 V B的计算引擎[J].国外电子测量技术,2002,(6):31-33.
6 欧阳明,等.VB与MATLAB混合编程在工程中的应用[J].电子技术,2009,(7):7-9.
7 李永松,艾凯,尹健民.基于VB与Matlab的BP神经网络在地应力场分析中的应用[J].长江科学院院报,2009,(6):24-27.
8 苏金明,刘宏,刘波.MATLAB高级编程[M].北京:电子工业出版社,2005.
APPLICATION OF MIXED-PROGRAMMING OF VB AND MATLAB IN CRUSTAL DEFORMATION DATA PROCESSING
Hu Jing1,2),Wu Yun1,2)and Zhang Yan1,2)
(1)Institute of Seismology,CEA,Wuhan 430071 2)Wuhan Base of Institute of Crustal Dynamics,CEA,Wuhan430071)
A mixed-programming method with VB and Matlab based on the COM object model is introduced,performing how to use the method in programming for crustal deformation processing software and how to transfer data each other between VB and Matlab.The integrated software not only takes full advantages of VB and Matlab,but also runs independently without Matlab platform.
VB;MATLAB;COM Builder;mixed-program;crustal deformation
1671-5942(2011)Supp.-0122-05
2010-08-18
武汉大学地球空间环境与大地测量教育部重点实验室开放基金(08-01-05)
胡静,女,1983年生,中国地震局地震研究所硕士研究生,研究领域:地形变软件开发.E-mail:evangeline1001@sohu.com
P209
A