基于Matlab和VC联合编程的数据处理系统
来源:岁月联盟
时间:2010-08-30
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文本输出的缓冲区 |
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所示。