基于.NET的MATLAB与Visual Basic混合编程的研究

2012-09-22 10:30覃钊
城市勘测 2012年6期
关键词:窗体数组调用

覃钊

(河池市城市规划测绘综合技术服务中心,广西河池 547000)

1 前言

在测绘等科学研究和工程计算领域经常要运用到微分、线性代数等数学知识进行公式的推导,运用到大量的矩阵运算,过去人们耗费大量的时间来进行公式推导和编写数学计算函数。MATLAB的出现使公式的微分、线性化等工作可以用软件来进行,也提供了一般的高级编程语言都没有的强大矩阵计算、数值分析等功能,把人们从低级的算法程序编写及公式推导中解放出来。本文将研究如何用Visual Basic通过.Net调用MATLAB函数来提高软件编写的效率。

2 Visual Basic简介

Visual Basic是一种由微软公司开发的包含协助开发环境的事件驱动编程语言。从任何标准来说,VB都是世界上使用人数最多的编程语言——不仅是盛赞VB的开发者还是抱怨VB的开发者的数量。它源自于BASIC编程语言。Visual Basic拥有图形用户界面(GUI)和快速应用程序开发(RAD)系统,可以轻易地使用DAO、RDO、ADO连接数据库,或者轻松创建ActiveX控件。程序员即使是初学者都可以轻松使用Visual Basic提供的组件快速建立一个应用程序,特别适合广大工程技术人员用来开发本专业的应用软件。Visual Basic 2011是微软公司推出的Visual Basic最新版本,其功能比以前任何版本都强大,可与C++等语言相媲美。

3 MATLAB简介

MATLAB是由美国MathWorks公司发布的主要面对科学计算、可视化以及交互式程序设计的高科技计算环境。它将数值分析、矩阵计算、科学数据可视化以及非线性动态系统的建模和仿真等诸多强大功能集成在一个易于使用的视窗环境中,为科学研究、工程设计以及必须进行有效数值计算的众多科学领域提供了一种全面的解决方案,并在很大程度上摆脱了传统非交互式程序设计语言(如C、Fortran)的编辑模式,代表了当今国际科学计算软件的先进水平。在MATLAB环境下,许多复杂的数学运算,如求矩阵的行列式值、求矩阵的逆及其特征值、求函数的微分、求函数的积分、进行多项式插值、解微分方程等,都有现成的函数可以调用。MATLAB的基本数据单位是矩阵,它的指令表达式与数学、工程中常用的形式十分相似,故用MATLAB来解算问题要比用C,FORTRAN等语言完成相同的事情简捷得多。但是,很多时候仅仅依靠MATLAB环境还是不能很好地完成工作,MATLAB和其他程序之间的数据交换就显得十分必要。MATLAB程序接口的出现,就解决了这些问题,通过接口与其他编程环境交互,各取所长,充分发挥 MATLAB计算的优点。MATLAB从R2006a开始,就开始用.NET接口逐渐取代了.COM接口。

4 .NET简介

.NET是微软公司的一组软件技术,核心部分是.NET Framework,最新版本为4.0,它提供CLR(公共语言运行库)对各种程序的支持,通常将在CLR的控制下运行的代码,称为托管代码(managed code),使用.NET开发的程序需要在.NET Framework下才能运行。通过使用Visual Studio.NET开发工具,可以使用多种语言开发,采用公共语言规范(CLS)后,编译为中间语言,这种语言是专门针对公共语言的,和其他高级语言无关,因此,高级语言可以在这个层面上实现融合和互通。MATLAB Builder NE就是将M文件编译为位于Basic Class Library同一层,实现了程序的运行。

5 Visual Basic调用MATLAB函数

为了将MATLAB中的程序作为组件提供给其他.NET程序使用,需要做两方面的工作:首先是在MATLAB环境中将M文件打包编译为.NET程序集,其次在外部程序中添加对程序集的引用。

5.1 M文件打包编译.NET程序集

在这里以一个平面坐标转换四参数的计算为例子,四个参数分别是:平移参数x0,y0,旋转参数θ,尺度参数m。

四参数坐标转换函数模型为:

已知2个公共点(见表1):

公共点坐标表 表1

把2个公共点代入可得到4个方程,写成矩阵形式:

系数阵 A为4×4方阵,可以直接求逆,因此V=A-1F。

V为各参数改正数矩阵,X为参数矩阵,X0为参数近似值矩阵。

上述公式中需要运用到矩阵的乘法、逆运算、加法。为了在Visual Basic中能直接进行矩阵运算,需要把MATLAB中的3个矩阵运算函数打包发行为.NET程序集。

在MATLAB环境下,把外部程序需要调用的函数保存为M文件,通过deploytool把数个M文件编译为.NET程序集。

(1)建立M文件

点击菜单File→New→Function M-File,建立新的函数型M文件,在编辑窗口出现下列函数原型:

这个函数是用于返回m*n阶的所有元素为0的矩阵。然后把这个函数保存为NewWmarray.m文件,MATLAB的默认文件名就是函数名.m。逆运算、加法、乘法的M文件以此依次建立,下面是各个函数的代码:

从这些函数我们可以看出,我们不需要知道这些矩阵运算是怎么进行的,也不需要写太多的代码就可以完成MATLAB的函数打包,省去了大量用于编写函数的时间。

(2)编译.NET程序集

①新建工程项目

在MATLAB命令窗口中输入:

在出现的Deployment Tool工具中选择新建工程项目将出现图1所示对话框。

图1 新建MATLAB.NET项目

选择 MATLAB Builder NE→.NET Component,设置好项目名称、保存位置,在这里把项目名称设置为MatrixNet,然后按确定。

②为项目添加M文件

在Deployment Tool中把与项目名称相同的类改名为Functions,并为该类添加我们事先准备好的M文件,如图2所示。

图2 Deployment Tool界面

M文件中的函数将作为Functions类的方法而存在。再点击settings按钮,在.NET选项里,把 Microsoft Framework设置为 default,Assmly Type设置为 private,如果开发的软件需要通过网络远程连接的点选Enable.NET remoting,见图3,最后按 OK。

图3 .NET设置界面

③编译

在Deployment Tool窗体中点击Build the project按钮进行编译,编译后的文件保存在项目目录下的distrib子目录中,共3个文件:项目名.dll(MATLABNet.dll),项目名 Native.dll(MATLABNetNative.dll),Readme.txt,若在图 3 中勾选了 Enable .NET remoting了,还应包括2个文件:I项目名.dll(IMATLABNet.dll),I项目名 Native.dll(IMATLABNetNative.dll)。

④打包与发布

为了使编译获得的.NET程序集能在没有安装MATLAB软件的计算机或服务器上运行,发布程序时需与MATLAB组件运行环境(MCR)一起打包,当然,如果已经安装有MCR的计算机或本地计算机可以直接复制使用。MCR全称是 MATLAB Compiler Runtime,是一个由MATLAB共享类库构成的执行引擎,它能够使MATLAB文件在没有安装MATLAB的机器上运行。在MATLAB中输入命令“mcr”或者“mcrinstaller”后获得下面信息:

第一行是说明当前MCR安装程序为WIN64位,版本号为7.10,第二行为其保存路径;第三、四、五行说明MCR其他平台的安装程序位置,可忽略;第六、七行为当前可用的MCR完整路径。

在Deployment Tool窗体中点击 settings..按钮,在出现的工程项目设置窗体中选择Packaging选项,勾选Include MATLAB Compiler Runtime(MCR),然后依次设置当前MCR保存路径、打包后的安装文件名,见图4,最后OK按钮,回到Deployment Tool窗体后,点击Package the project按钮,完成MATLAB工程项目的打包工作。

图4 打包设置界面

把打包获得的安装程序复制到目标计算机上运行,设置好安装路径并安装,即可完成MATLAB.NET程序集的发布。

5.2 Visual Basic调用MATLAB.NET程序集

(1)建立工程项目

启动Micsoft Visual Studio后建立新建Visual Basic应用程序窗体程序,把项目名称改为平面坐标转换。把Form1窗体设置成图5形式。

图5 软件运行界面

(2)Visual Basic调用MATLAB程序集

①添加引用

找到MCR安装目录和发布的程序集安装目录,分别添加引用 Mwarray.dll和 MatrixNet.dll,若是使用网络连接的本地计算机,那么选择IMwarray.dll和IMatrixNet.dll,另外还需要配置好服务器端,在这里就不加细述。

②导入命名空间

为应用程序添加一个模块module1,并在该模块的模块代码头部添加下列代码:

③MATLAB函数的调用

MatrixNet即我们引用打包编译的MatrixNet.dll后获得的命名空间,前面提到过M文件里面的函数将作为Functions类的方法存在,我们需要定义一个新的Functions类并经过初始化才能调用这些方法:

④Mwarray类型数组与MWNumericArray类型数组

MathWorks.MATLAB.NET.Arrays命名空间提供从其他任何兼容CLS(Common Language Specification)语言访问MATLAB中数组的功能,这些类支持数组格式化、类型的特定索引和错误处理的功能。MATLAB函数的输入参数和返回值都是Mwarray型数组,但是Visual Basic并不能操作这种类型的数组,故MATLAB又定义了一些中间类型数组,其中MWNumericArray类型数组是数值型数组,可以在Visual Basic中进行数值运算操作。例如在平面坐标转换参数计算的系数矩阵A,它是一个4×4维的方阵,如果直接定义为Mwarray型,我们在实际中很难对它的维数进行定义和更改,也无法转换成双精度类型进行计算,因此我们定义它为MWNumericArray,但是这个 MWNumericArray类型数组又不是MATLAB函数的标准数组,也无法操作它的维数和元素。因此我们还是需要定义一个Mwarray类型的数组c(),然后通过前面定义了一个返回m×n阶的零矩阵的mwarray矩阵进行初始化:c=MatrixLib.NewWmarray(1,4,4),然后把这个数组克隆给 A,A=c(0).Clone,A就变成4×4的零矩阵,也可以被MATLAB的函数所接受,最后c()矩阵不需要了,我们要把他释放掉以节约空间:c(0).Dispose()。强调一点,不能直接这样写A=c(0),否则就是把数组A的地址指向了数组c(0)的地址,假若同时初始化几个同样的数组,这些数组都会指向同一个地址,那么这些数组其实就是同一个数组,其中一个数组改变,那么其他数组都改变,要避免出现这种情况。具体代码如下:

这样就可以完成一个4*4阶的MWNumericArray矩阵的定义和初始化,且现在这个矩阵也能被MATLAB函数所接受。

⑤Form1窗体代码

程序运行结果如图5所示。

6 结语

本文的编程环境为 Visual Studio 2010、MATLAB R2009a和.NET3.5,事实证明基于.NET的Visual Basic调用MATLAB函数脱离MATLAB运行环境的混合编程是可行的,在软件开发中,开发人员不再需要耗费时间在编写数值分析、矩阵计算、科学数据可视化等函数上,甚至也不需要了解很深的这方面的知识,把这一切都交给MATLAB去做,大大提高了程序编写和科研学习的效率。由于本文主要研究如何进行混合编程,因此本文的坐标转换参数的计算仅计算简单的2个公共点的情况,若多于2个公共点,系数阵不能求逆,需要采用最小二乘法进行平差计算及残差计算、剔除不合格公共点、精度评定等。另外MATLAB的符号运算能力也很强,在公式推导时可以加快推导速度,但是在这里由于篇幅有限就不多加叙述。

[1]孔祥元,郭际明,刘宗泉.大地测量学基础[M].武汉:武汉大学出版社,2001.

[2]武汉测绘科技大学测量平差研究室.测量平差基础[M].武汉:武汉大学出版社,1996.

[3]杨永健.基于.NET平台的MATLAB应用程序集成研究[J].软件导刊,2009.

[4]董维国.深入浅出MATLAB7.X混合编程[M].北京:机械工业出版社,2005.

[5]洪一新,吴灿铭.Visual Basic 2008程序设计完全自学教程[M].北京:清华大学出版社,2009.

[6]马莉.MATLAB语言实用教程[M].北京:清华大学出版社,2010.

猜你喜欢
窗体数组调用
JAVA稀疏矩阵算法
JAVA玩转数学之二维数组排序
核电项目物项调用管理的应用研究
试谈Access 2007数据库在林业档案管理中的应用
LabWindows/CVI下基于ActiveX技术的Excel调用
Excel数组公式在林业多条件求和中的应用
基于系统调用的恶意软件检测技术研究
寻找勾股数组的历程
巧设WPS窗体控件让表格填写更规范
利用RFC技术实现SAP系统接口通信