APP下载

C#与Matlab混合编程在HDPE膜数据成像中的应用

2015-05-30成秋蕾高慧

企业技术开发·中旬刊 2015年12期

成秋蕾 高慧

摘  要:填埋场渗漏检测系统是以Visual studio 2010为开发平台,C#为编程语言,Matlabr2009a为主要做图工具的软件。针对其数据成像功能,文章提出了一种以C#与Matlab混合编程的数据成像方法,它通过相关算法去除干扰数据达到成像效果,并将生成的Matlab图像嵌入到VC界面,使HDPE膜的成像效果更加明显并提升了系统的运行速度。

关键词:COM组件;异常干扰数据;数据成像

中图分类号:TP277     文献标识码:A      文章编号:1006-8937(2015)35-0077-02

垂直铺设防渗膜是环境工程领域常用的防渗处理手段,在铺塑过程中,由不同原因造成的防渗膜搭接不好、划破及漏点等问题会大大降低防渗膜的防渗效果,导致检测过程中存在一定的局限性。目前国内对于防渗膜的渗漏检测一般采用双电极法、电极栅格等,但其检测漏洞的效果不明显,不宜发现错误和异常且运行速度缓慢等。

C#语言继承了C/C++的优点,利用C#.NET开发的系统具有界面友好、执行速度快等优点,生成的可执行文件能有效保护算法和数据。Matlab是常用的科学及工程计算软件,具有强大的数据可视化功能。本文将C#.NET与Matlab混合编程的方法用于垂直防渗膜检测的数据可视化过程来模拟刻画垂直防渗膜的渗漏情况,通过算法去除干扰数据,并将检测的HDPE防渗膜数据生成的Matlab图像嵌入到VC界面中,相比传统的渗漏检测方法节约运行时间并有更佳的可视化效果。

1  C#与Matlab混编的实现过程

在C#中调用Matlab使用Matlab DeployTool生成生成COM组件或者.NET DLL文件的方法。因为使用Com Builder连接则十分简单,具有跨平台优势,软件版本的兼容性较好,COM组件成为本文首先的连接方式。

1.1  数据准备

第一步:安装软件。按先后顺序依次安装Visual Studio 2010、Matlab r2009a和MCRInstall.exe。安装MCRInstall.exe的过程:在matlab命令窗口输入mcr命令,得到MCRInstall.exe的路径,双击打开并安装。

第二步:利用MATLAB编译器将m文件编译为dll文件。

第三步:利用MATLAB Builder for COM将m函数编译封装成COM组件。

新建一个项目,在MATLAB的命令窗口中输入“deploytool”。选择Project- >Add File 添加相应的M文件,则M文件将作为类的方法出现在COM组件中,选择Build ->COM Object编译和发布COM组件。

1.2  COM组件的导入和编程

在新建C#工程中,引用生成的DLL文件。在C#.NET应用程序中使用该COM组件,右键单击工程项目下引用,在浏览中找到Xlunwen.dll的位置添加至引用中,添加完成后可在C#.NET中使用。使用COM组件需要调用组件中类的方法,创建包含这个方法的类的实例。代码如下:

Xlunwen.Xlunwen t = new Xlunwen.Xlunwen();

MWNumericArray s = array2;

t.Xiaolunwen(s); //其中Xiaolunwen为实现数据成像效果的M文件。

运行结果,如图1所示。

2  基于时间序列的HDPE膜数据去噪算法

采集的HDPE膜数据左右两边受电势影响普遍偏高,造成了局部时间点数据异常的特征,而漏洞数据也比正常数据偏高,如何区分数据中漏洞数据和去除电势干扰形成的异常数据是本文的难点所在。

2.1  算法的基本思想

本文采用的是基于时间序列的HDPE膜数据去噪算法,基本思想是对整体数据进行分类为正常数据、漏洞数据和受电势干扰数值升高的非漏洞数据,通过算法对数据加以分析,将非漏洞数据识别并转化为正常数据,达到去除干扰数据的目的。2.2  具体做法

①对整体数据求均值。所有小于均值的数据为正常数据,将其值至为0,大于均值的数据为漏洞数据和异常数据,将其保留为矩阵A[m,n]。

②对矩阵A[m,n]求一阶导数得B[m,n]。观察数据的特征得知,发现矩阵左端异常数据走向为单调递减,导数值均为负数;矩阵右端异常数据走向为单调递增,导数值均为正数;而漏洞数据走向特征则是先递增后递减的趋势。

③将干扰数据的导数值至0。将B[m,n]在Y轴分成m等份区间,每一个区间内的数据都是一个时间序列数据,依次从左边扫描矩阵B[m,n]直到找到第一个导数值为正数的数据为止,将导数值为负数的数据全部至为0,达到去除左端的异常干扰数据的目的。同理,去除右端的异常干扰数据,则矩阵中只剩漏洞部分的导数值。

④将漏洞部分还原为原数据进行数据成像,效果如图2所示。

3  窗体间的嵌入

VS2010中有4个对窗口进行操作的API函数:FindWindow、SetParent、SetWindowLong和MoveWindow。基本思想:将Matlab生成的图形窗口嵌入到VS界面,通过VS平台获取Figure窗口的句柄,将Figure图像要嵌入的空间设置为父窗口,Figure窗口设置为子窗口。 程序执行代码如下:

IntPtr hChild = IntPtr.Zero;  //子窗口句

IntPtr handle =pictureBox1.Handle;//父窗口

hChild = dll.FindWindow(null, “Figure 1”);

......

dll.SetParent(hChild, handle); //将子窗口嵌入到父窗口中

运行结果如图3所示。

4  编程方式的运行时间对比

C#与Matlab混合编程对110次采样值32个采集点(110×32)的数据多次成像所用的

平均时间对比,见表1。

5  结  论

表1中说明采用混编代码长度较VS2010语言代码长度大大缩短,而运行时间又比Matlabr2009a语言编程减少许多。本文充分发挥了MATLAB和C#各自的优势,实现了MATLAB和C#的混合编程,利用算法去除干扰数据,并完成了Figure窗口到C#界面的内嵌,提高了程序运行速度和成像数据的精确度。

参考文献:

[1] 能昌信,董路,姜文峰,等.土工膜渗漏检测系统研究[J].环境科学与技   术,2005,(28).

[2] 王丽辉,袁保宗.鲁棒的模糊C均值和点云双边滤波去噪[J].北京交   通大学学报,2008,(2).

[3] 苏金明,查国明.MATLAB 与外部程序接口[M].北京:电子工业出版   社,2004.

[4] 潘爱民.COM原理及应用[M].北京:清华大学出版社,2003.