基于Matlab和VC联合编程的数据处理系统

来源:岁月联盟 作者:王毅 董建国 徐 时间:2010-08-30
  摘  要 文章探讨了Visual C++ 6.0数据库技术和 MATLAB 6.5 强大的数值和图形显示功能。利用Matlab 和VC编制软件对数据进行处理,提高了数据处理的效率。    关键词 Matlab;数据处理系统;数据库 

1  引言

    Visual C++ 是目前综合性最高、最强大的软件开发工具之一。Matlab是一种高性能的数值计算和可视化软件,在数值分析、信号处理、系统辨识、特殊函数和图形等方面具有广泛的应用。由于测试结果有上百万个数据量,且数据存储在数据库中,为了便于研究处理数据的方法,获得可靠的测试结果,本文探讨利用Microsoft Visual C++ 6.0数据库技术 和 MATLAB 6.5 强大的数值计算和图形显示并联合编制软件对数据进行处理。我们把 Matlab与Visual C++结合起来,简化复杂的数据处理方法研究,体验数据处理的工作效率和即时性。此系统在某次数据处理系统中得到广泛的应用。

2  数据处理系统的关键技术

    数据处理系统是利用Microsoft Visual C++ 6.0数据库技术 和 MATLAB 6.5 强大的数值计算和图形显示并联合处理测量数据的系统,数据处理系统涉及到Microsoft Visual C++ 6.0数据库技术和Microsoft Visual C++ 6.0与MATLAB的接口技术,为了能够使系统具有可移植性和即时性,系统使用的数据库技术是ADO数据库访问技术,Microsoft Visual C++ 6.0与MATLAB的接口技术是引擎技术。

2.1 ADO数据库访问技术

    ADO(ActiveX Data Object)是一种基于COM(组件对象模型)的自动化接口(IDispatch)技术,并以OLE DB(对象连接和镶入的数据库)为基础,经过OLE DB包装后的数据库访问技术,利用它可以快速的创建数据库应用程序。这要比ODBC API、DAO、RDO都要简单易用、灵活。    ADO数据库开发的基本流程如下:    (1)初始化COM库,引入ADO库定义文件。    (2)用Connection对象连接数据库。    (3)利用建立好的连接,通过三个智能指针执行查询、处理结果记录集和SQL命令,使用完毕后关闭连接释放对象。2.1.1 初始化COM库    在MFC中采用一种方法来实现初始化COM,这种方法只需要一条语句便可以自动为我们实现初始化COM和结束时关闭COM的操作,语句如下所示:AfxOleInit()。2.1.2 引入ADO库定义文件    用#import语句来引用支持ADO的组件类型库(*.tlb),其中类型库可以作为可执行程序(DLL、EXE等)的一部分被定位在其自身程序中的附属资源里,如:被定位在msado15.dll的附属资源中,只需要直接用#import引用它即可。可以直接在Stdafx.h文件中加入下面语句来实现:    #import "c:/program files/common files/system/ado/ msado15.dll" /     no_namespace /rename ("EOF", "adoEOF")  2.1.3 三个智能指针    数据处理系统使用前面用#import语句引用类型库时,生成的包装类.tlh中声明的智能指针中有这三个_ConnectionPtr、_RecordsetPtr和_CommandPtr指针,数据处理系统通过这三个智能指针使用ADO的连接数据库、SQL命令、记录集的遍历、更新操作。

2.2 MATLAB与Visual C++的接口技术

    MATLAB系统提供一个非常重要的组件—MATLAB应用程序接口,它可以向MSATLAB环境传送数据也可从MATLAB环境接收数据;Visual C++可以调用MATLAB编写的程序,在这里数据处理系统采用MATLAB引擎库,MATLAB引擎库包含了若干个控制MATLAB引擎的函数,如表1所示。表1 MATLAB引擎的函数表
函数名函数功能
engOpen启动MATLAB引擎
engClose关闭MATLAB引擎
engGetArray从MATLAB引擎中获取一个MATLAB矩阵
engPutArray向MATLAB引擎发送一个MATLAB矩阵
engEvalString执行于一个MATLAB命令或自编的MATLAB函数
engOutputBuffer创建一个存储MATLAB文本输出的缓冲区
    数据处理系统主要应用的引擎函数是engEvalString、engOpen、engClose等函数。下面通过简单的例子说明:    #include "stdafx.h"    #include "engine.h"    int MatlabDraw()    {    Engine *ep;    if (!(ep = engOpen(NULL)))    {    MessageBox ((HWND)NULL,"Can't start MATLAB engine","Matlab Draw",MB_OK);    return 0;    }                      /*启动MATLAB引擎*/    engEvalString(ep, "x=0:0.01:2*pi;y=sin(x);plot(x,y);"); /*执行MATLAB命令:绘图*/    engClose(ep);         /*关闭MATLAB引擎*/    return 1;    }

2.3 MATLAB与Visual C++的数据传输

    MATLAB与Visual C++的数据传输需要三个步骤,第一完成Visual C++读取ACCESS数据库的大量数据;第二把Visual C++读取到的数据传输到MATLAB中,并在利用MATLAB中自编的函数进行处理;第三把处理结果传输到Visual C++中。下面通过例子说明MATLAB与Visual C++的数据传输。double dataplot[2000];mxArray *T=NULL;int x=0;while(!m_pRecordset->adoEOF)    {var = m_pRecordset->GetCollect("场强");               // 读出库中字段数据dataplot[x]=var;if(x== Jshuqi -1) //判断是否数据读完,数据传输到MATLAB {T = mxCreateDoubleMatrix(1, Jshuqi, mxREAL);          /*创建一个矩阵*/mxSetName(T, "T");                                 /*设置矩阵的名字为“T”*/ memcpy((char *)mxGetPr(T), (char *)dataplot, Jshuqi* sizeof(double)); //向矩阵“T”赋值 engPutArray(ep, T);                   /*向MATLAB引擎发送一个MATLAB矩阵*/mxArray *result=engGetArray(ep,"T");   //VC++读取Matlab的矩阵T中的数据double *p=mxGetPr(result);            mxDestroyArray(T);                 /*从内存中撤销矩阵“T”*/}x++;m_pRecordset->MoveNext();}

3 数据处理系统功能

    数据处理系统主要对测试数据进行处理,并提供与测试数据相关的处理结果,数据的处理方法根据测试方法和理论方法来确定,本系统的主要功能在于能够方便及时地存储原始测试数据,并能够方便数据处理方法的研究,为获得可靠科学的测试数据处理结果提供了极为方便的途径。其功能主要包括:存储测试数据到MATLAB环境中、合并我们所需一起处理的多次测试数据、采用数据处理方法统计测试数据得到的结果。    数据处理系统界面如图1所示。图1   数据处理系统界面

3.1 存储测试数据

    在数据处理系统中,选择所要处理的测试代号或者在测试代号编辑框中输入所需的测试代号,左击 “保存数据” 按钮,就可以把对应测试代号的数据读入MATLAB环境中。

3.2 合并测试数据

    在数据处理系统中,处理的测试数据往往对几次测试的数据需要一起处理,系统可以把几次测试代号所对应数据按一定的顺序进行合并。    系统的操作为:对2个和多个测试数据进行合并,只需选中“2个测试代号”或“多个测试代号”,在保存名中输入保存名,然后进行读取测试数据操作,这样会在“数据表名”中显示读取数据的测试代号名和在“存储数据表名”中显示刚才在保存名中输入的名字;到读取完所有的所需数据后只需左击“合并数据”按钮,就可以完成合并测试数据的操作。

3.3 采用数据处理方法统计测试数据

    统计测试数据是实现数据处理方法,虽不同测试的数据处理方法不同,但只需少量的工作就可以完成所对应的数据处理,而且在处理过程中能够根据数据结果来即时的修改数据处理方法。系统只需我们实现在MATLAB环境中测试数据处理方法的程序,这样为研究人员提供了极大的方便。    系统只需把数据处理方法的程序放入系统的处理函数里,就可以实现对测试数据的统计处理,本系统在数据存储好后只需按“作图求值”按钮,就可以获得我们所需的测试数据结果和统计图。

4 结论

    本系统很好地结合了Visual C++和MATLAB的高性能的数值计算优点,此系统在某次测试中处理了上百万个数据量的数据库,为研究科学合理的数据处理方法提供了方便和节约了时间,并在最后提供可靠科学的测试结果,提高了测试数据处理的工作效率和即时性,具有较高的社会效益。

[1]刘志俭等. MATLAB应用程序接口用户指南[M]. 北京:科学出版社,2000.[2]陶红,袁金荣. Matlab与C/Visual C++混合编程的实现[J].计算机工程与应用,2000(10)[3]MichaeI J. Young著,邱仲潘等译. Visual C++6从入门到精通[M]. 北京:出版社,1999.

图片内容