2024年4月25日发(作者:)

2012

12

6

文章编号

:1672-8262(2012)06-107-06

城市勘测

UrbanGeotechnicalInvestigation&Surveying

中图分类号

:P209

Dec.2012

No.6

文献标识码

:B

基于

.NET

MATLAB

VisualBasic

混合编程的研究

覃钊

*

河池市城市规划测绘综合技术服务中心

广西河池

547000)

:VisualBasic

是使用人数最多的高级编程语言之一

开发者能轻易快速建立一个应用软件

。MATLAB

具有强

.NET

是微软公司发布用于取代

.COM

的新一代软件接口技术

本文以进行大的数值分析

矩阵运算和仿真等功能

平面坐标转换四参数的计算为例

介绍在

VisualBasic

程序编写中如何通过

.NET

接口调用

MATLAB

函数进行混合编

完成科学研究和工程计算

关键词

:.NET;MATLAB;VisualBasic;

混合编程

;

测绘

1

前言

对科学计算

可视化以及交互式程序设计的高科技计

算环境

它将数值分析

矩阵计算

科学数据可视化以

及非线性动态系统的建模和仿真等诸多强大功能集成

在一个易于使用的视窗环境中

为科学研究

工程设计

以及必须进行有效数值计算的众多科学领域提供了一

并在很大程度上摆脱了传统非交种全面的解决方案

Fortran)

的编辑模式

互式程序设计语言

C、

代表了

当今国际科学计算软件的先进水平

MATLAB

境下

许多复杂的数学运算

如求矩阵的行列式值

求函数的微分

求函数的积分

矩阵的逆及其特征值

进行多项式插值

解微分方程等

都有现成的函数可以

调用

。MATLAB

的基本数据单位是矩阵

它的指令表

达式与数学

工程中常用的形式十分相似

故用

MAT-

LAB

来解算问题要比用

C,FORTRAN

等语言完成相同

的事情简捷得多

但是

很多时候仅仅依靠

MATLAB

MATLAB

和其他程序环境还是不能很好地完成工作

之间的数据交换就显得十分必要

。MATLAB

程序接口

的出现

就解决了这些问题

通过接口与其他编程环境

交互

各取所长

充分发挥

MATLAB

计算的优点

MATLAB

R2006a

开始

就开始用

.NET

接口逐渐取

代了

.COM

接口

在测绘等科学研究和工程计算领域经常要运用到

微分

线性代数等数学知识进行公式的推导

运用到大

量的矩阵运算

过去人们耗费大量的时间来进行公式

推导和编写数学计算函数

。MATLAB

的出现使公式的

微分

线性化等工作可以用软件来进行

也提供了一般

数值分析等的高级编程语言都没有的强大矩阵计算

功能

把人们从低级的算法程序编写及公式推导中解

放出来

本文将研究如何用

VisualBasic

通过

.Net

MATLAB

函数来提高软件编写的效率

2VisualBasic

简介

VisualBasic

是一种由微软公司开发的包含协助

VB

开发环境的事件驱动编程语言

从任何标准来说

——

不仅是盛赞都是世界上使用人数最多的编程语言

VB

的开发者还是抱怨

VB

的开发者的数量

它源自

BASIC

编程语言

。VisualBasic

拥有图形用户界面

(GUI)

和快速应用程序开发

(RAD)

系统

可以轻易地

RDO、ADO

连接数据库

使用

DAO、

或者轻松创建

ActiveX

控件

程序员即使是初学者都可以轻松使用

VisualBasic

提供的组件快速建立一个应用程序

特别

适合广大工程技术人员用来开发本专业的应用软件

VisualBasic2011

是微软公司推出的

VisualBasic

最新

版本

其功能比以前任何版本都强大

可与

C++

等语

言相媲美

4.NET

简介

.NET

是微软公司的一组软件技术

核心部分是

NETFramework,

最新版本为

4.0,

它提供

CLR(

公共语

言运行库

对各种程序的支持

通常将在

CLR

的控制

下运行的代码

称为托管代码

(managedcode),

使用

.NET

开发的程序需要在

.NETFramework

下才能运行

通过使用

VisualStudio.NET

开发工具

可以使用多种

3MATLAB

简介

MATLAB

是由美国

MathWorks

公司发布的主要面

*

收稿日期

:2012—04—26

作者简介

覃钊

(1976—),

工程师

主要从事测绘工程技术工作

108

城市勘测

2012

12

语言开发

采用公共语言规范

(CLS)

编译为中间语

这种语言是专门针对公共语言的

和其他高级语言

无关

因此

高级语言可以在这个层面上实现融合和互

。MATLABBuilderNE

就是将

M

文件编译为位于

BasicClassLibrary

同一层

实现了程序的运行

x

西

=x

0

+(1+m)(cos

θ

x

-sin

θ

y

y

西

=y

0

+(1+m)(sin

θ

x

+cos

θ

y

线性化后得到如下方程

a

11

v

1

+a

12

v

2

+a

13

v

3

+a

14

v

4

+f

1

=0

a

21

v

1

+a

22

v

2

+a

23

v

3

+a

44

v

4

+f

2

=0

公式中各系数和常数项

a

11

=a

21

=1

a

12

=b

21

=0

a

13

=cos

θ

0

x

-sin

θ

0

y

a

14

=(1+m

0

)(-sin

θ

0

x

-cos

θ

0

y

a

23

=sin

θ

0

x

+cos

θ

0

y

a

24

=(1+m

0

)(cos

θ

0

x

-sin

θ

0

y

f

1

=-[x

0

0

+(1+m

0

)(cos

θ

0

x

-sin

θ

0

y

)-x

西

f

2

=-[y

0

0

+(1+m

0

)(sin

θ

0

x

+cos

θ

0

y

)-y

西

已知

2

个公共点

见表

1):

5VisualBasic

调用

MATLAB

函数

为了将

MATLAB

中的程序作为组件提供给其他

.NET

程序使用

需要做两方面的工作

首先是在

MAT-

LAB

环境中将

M

文件打包编译为

.NET

程序集

其次

在外部程序中添加对程序集的引用

5.1M

文件打包编译

.NET

程序集

在这里以一个平面坐标转换四参数的计算为例

y

0

四个参数分别是

平移参数

x

0

旋转参数θ

尺度

参数

m。

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

独立坐标系

y

坐标

/m

198689.183

198815.462

公共点坐标表

公共点号

A

B

x

坐标

/m

36284.622

36306.259

距离

/m

128.119

X

坐标

/m

2732957.417

2732980.935

1980

西安坐标系

Y

坐标

/m

502291.825

502417.691

1

距离

/m

128.045

2

个公共点代入可得到

4

个方程

写成矩阵形式

A

4×4

V

4×1

-F

4×1

=0

系数阵

A

4×4

方阵

可以直接求逆

因此

V=A

-1

F。

V

为各参数改正数矩阵

,X

为参数矩阵

,X

0

为参数

近似值矩阵

X=X

0

+V

x

0

X=[

X

0

=[x

0

0

V=[v

1

F=[f

1

y

0

y

0

0

v

2

f

2

f

3

m

m

0

v

3

T

θ

%Detailedexplanationgoeshere

end

output_args

是输出变量

(

矩阵

),input_args

是输入变量

(

Unitled1

为函数名

,input_args

改阵

),

然后把

output_args

改为

a,

n,Unitled1

改为

NewWmarray,%

后为该函数的注释说明

m,

n);

获得下面的函数

:

在函数体中输入一行

a=zeros(m,

functiona=NewWmarray(m,n)

a=zeros(m,n);

end

这个函数是用于返回

m*n

阶的所有元素为

0

T

θ

T

v

4

0

矩阵

然后把这个函数保存为

NewWmarray.m

文件

MATLAB

的默认文件名就是函数名

.m。

逆运算

乘法的

M

文件以此依次建立

下面是各个函数的

代码

矩阵逆运算函数

functionm=MatrixInv(a)

m=inv(a);

end

T

f

4

上述公式中需要运用到矩阵的乘法

逆运算

为了在

VisualBasic

中能直接进行矩阵运算

需要

MATLAB

中的

3

个矩阵运算函数打包发行为

.NET

程序集

MATLAB

环境下

把外部程序需要调用的函数

保存为

M

文件

通过

deploytool

把数个

M

文件编译为

NET

程序集

(1)

建立

M

文件

建立新的

点击菜单

File

New

FunctionM-File,

函数型

M

文件

在编辑窗口出现下列函数原型

function[output_args]=Untitled1(input_args)

%UNTITLED5Summaryofthisfunctiongoeshere

矩阵加法函数

functionm=MatrixAdd(a,b)

m=a+b;

end

矩阵乘法函数

functionm=MatrixMultiplication(a,b)

m=a*b;

end

6

期覃钊

.

基于

.NET

MATLAB

VisualBasic

混合编程的研究

109

从这些函数我们可以看出

我们不需要知道这些

矩阵运算是怎么进行的

也不需要写太多的代码就可

以完成

MATLAB

的函数打包

省去了大量用于编写函

数的时间

(2)

编译

.NET

程序集

①新建工程项目

MATLAB

命令窗口中输入

>>deploytool

在出现的

DeploymentTool

工具中选择新建工程项

目将出现图

1

所示对话框

1

新建

MATLAB.NET

项目

选择

MATLABBuilderNE

.NETComponent,

置好项目名称

保存位置

在这里把项目名称设置为

MatrixNet,

然后按确定

②为项目添加

M

文件

DeploymentTool

中把与项目名称相同的类改名

Functions,

并为该类添加我们事先准备好的

M

如图

2

所示

2DeploymentTool

界面

M

文件中的函数将作为

Functions

类的方法而存

再点击

settings

按钮

.NET

选项里

Microsoft

Framework

设置为

default,AssmlyType

设置为

private,

如果开发的软件需要通过网络远程连接的点选

Enable

.NETremoting,

见图

3,

最后按

OK。

3.NET

设置界面

③编译

DeploymentTool

窗体中点击

Buildtheproject

按钮进行编译

编译后的文件保存在项目目录下的

distrib

子目录中

3

个文件

项目名

.dll(MATLAB-

Net.dll),

项目名

Native.dll(MATLABNetNative.dll),

Readme.txt,

若在图

3

中勾选了

Enable.NETremoting

还应包括

2

个文件

:I

项目名

.dll(IMATLABNet.

dll),I

项目名

Native.dll(IMATLABNetNative.dll)。

④打包与发布

为了使编译获得的

.NET

程序集能在没有安装

MATLAB

软件的计算机或服务器上运行

发布程序时

需与

MATLAB

组件运行环境

(MCR)

一起打包

当然

如果已经安装有

MCR

的计算机或本地计算机可以直

接复制使用

。MCR

全称是

MATLABCompilerRunt-

ime,

是一个由

MATLAB

共享类库构成的执行引擎

能够使

MATLAB

文件在没有安装

MATLAB

的机器上

运行

MATLAB

中输入命令

“mcr”

或者

“mcrinstall-

er”

后获得下面信息

TheWIN64MCRInstaller,version7.10,is:

D:ProgramFilesMATLABR2009atoolboxcompilerdeploy

win64MCRInstaller.exe

MCRinstallersforotherplatformsarelocatedin:

D:ProgramFilesMATLABR2009atoolboxcompilerde-

ploy<ARCH>

<ARCH>isthevalueofCOMPUTER('arch')onthetar-

getmachine.

FulllistofavailableMCRinstallers:

D:ProgramFilesMATLABR2009atoolboxcompilerdeploy

win64MCRInstaller.exe

Formoreinformation,readyourlocalMCRInstallerhelp.

OrseetheonlinedocumentationatTheMathWorks'website.

(Pagemayloadslowly.)

第一行是说明当前

MCR

安装程序为

WIN64

110

城市勘测

2012

12

版本号为

7.10,

第二行为其保存路径

第三

五行

说明

MCR

其他平台的安装程序位置

可忽略

第六

行为当前可用的

MCR

完整路径

DeploymentTool

窗体中点击

settings..

按钮

出现的工程项目设置窗体中选择

Packaging

选项

勾选

IncludeMATLABCompilerRuntime(MCR),

然后依次设

置当前

MCR

保存路径

打包后的安装文件名

见图

4,

OK

按钮

回到

DeploymentTool

窗体后

点击

Package

theproject

按钮

完成

MATLAB

工程项目的打包工作

4

打包设置界面

把打包获得的安装程序复制到目标计算机上运

设置好安装路径并安装

即可完成

MATLAB.NET

程序集的发布

5.2VisualBasic

调用

MATLAB.NET

程序集

(1)

建立工程项目

启动

MicsoftVisualStudio

后建立新建

VisualBasic

应用程序窗体程序

把项目名称改为平面坐标转换

Form1

窗体设置成图

5

形式

5

软件运行界面

(2)VisualBasic

调用

MATLAB

程序集

①添加引用

找到

MCR

安装目录和发布的程序集安装目录

别添加引用

Mwarray.dll

MatrixNet.dll,

若是使用网

络连接的本地计算机

那么选择

IMwarray.dll

IMa-

trixNet.dll,

另外还需要配置好服务器端

在这里就不

加细述

②导入命名空间

为应用程序添加一个模块

module1,

并在该模块的

模块代码头部添加下列代码

ImportsMathWorks

importsMathWorks.MATLAB.NET.Arrays

ImportsMathWorks.MATLAB.NET.Utility

ImportsMatrixNet

MATLAB

函数的调用

MatrixNet

即我们引用打包编译的

MatrixNet.dll

获得的命名空间

前面提到过

M

文件里面的函数将作

Functions

类的方法存在

我们需要定义一个新的

Functions

类并经过初始化才能调用这些方法

ModuleMatrixFunction

PublicMatrixLibAsNewFuctions

EndModule

在过程中调用逆运算函数

:

aa=MatrixLib.MatrixInv(A)

Mwarray

类型数组与

MWNumericArray

类型数组

MathWorks.MATLAB.NET.Arrays

命名空间提供

从其他任何兼容

CLS(CommonLanguageSpecification)

语言访问

MATLAB

中数组的功能

这些类支持数组格

式化

类型的特定索引和错误处理的功能

。MATLAB

函数的输入参数和返回值都是

Mwarray

型数组

但是

VisualBasic

并不能操作这种类型的数组

MATLAB

又定义了一些中间类型数组

其中

MWNumericArray

型数组是数值型数组

可以在

VisualBasic

中进行数值

运算操作

例如在平面坐标转换参数计算的系数矩阵

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

的零矩阵

也可以被

MAT-

LAB

的函数所接受

最后

c()

矩阵不需要了

我们要把

他释放掉以节约空间

:c(0).Dispose()。

强调一点

能直接这样写

A=c(0),

否则就是把数组

A

的地址指

6

期覃钊

.

基于

.NET

MATLAB

VisualBasic

混合编程的研究

111

向了数组

c(0)

的地址

假若同时初始化几个同样的数

这些数组都会指向同一个地址

那么这些数组其实

就是同一个数组

其中一个数组改变

那么其他数组都

改变

要避免出现这种情况

具体代码如下

DimAAsMWNumericArray

Dimc()AsMWArray

c=MatrixLib.NewWmarray(1,4,4)

A=c(0).Clone

c(0).Dispose()

这样就可以完成一个

4*4

阶的

MWNumericArray

矩阵的定义和初始化

且现在这个矩阵也能被

MAT-

LAB

函数所接受

Form1

窗体代码

PublicClassForm1

PublicStructurePointXY’

定义平面点结构

成员为该点的

x,y

坐标

成员数据类型都为双精度

DimxAsDouble

DimyAsDouble

EndStructure

PublicSubcsjs(ByValPT1AsPointXY,&_

ByValPT2AsPointXY,ByValPT3AsPointXY,&_

ByRefPT4AsPointXY)’

参数计算过程

DimA,aa,V,X,xx,X0,FAsMWNumericArray’

定义在

程序中直接参与计算的

MWNumericArray

类型的矩阵

Dimc()AsMWArray’

定义

MATLAB

标准类型的

MWArray

矩阵

Dimi,j,tAsInteger

DimNewPoint(1)AsPointXY

DimkAsDouble=5

DimOldPoint(1)AsPointXY

OldPoint(0)=PT1

OldPoint(1)=PT2

NewPoint(0)=PT3

NewPoint(1)=PT4

c=MatrixLib.NewWmarray(1,4,4)’

返回一个

4*4

0

矩阵

A=c(0).Clone’

初始化系数矩阵

aa=c(0).Clone’

释放空间

c=MatrixLib.NewWmarray(1,4,1)’

返回一个

4*1

0

矩阵

X=c(0).Clone

X0=c(0).Clone

F=c(0).Clone

V=c(0).Clone

xx=c(0).Clone

c(0).Dispose()

t=1

迭代计算坐标转换参数

DoUntilk<=0.1

X0=X.Clone

迭代计算系数阵

A

和常数阵

F

Fori=0To1

Forj=0To1

SelectCasej

Case0

A(t,1)=1

A(t,2)=0

A(t,3)=Math.Cos(X0(4,1).ToScalarDouble)*OldPoint

(i).x-Math.Sin(X0(4,1).ToScalarDouble)*OldPoint(i).y

A(t,4)=(1+X0(3,1).ToScalarDouble)*(-Math.Sin

(X0(4,1).ToScalarDouble)*OldPoint(i).x-Math.Cos(X0

(4,1).ToScalarDouble)*OldPoint(i).y)

F(t,1)=-(X0(1,1).ToScalarDouble+(1+X0(3,1).

ToScalarDouble)*(Math.Cos(X0(4,1).ToScalarDouble)*

OldPoint(i).x-Math.Sin(X0(4,1).ToScalarDouble)*Old-

Point(i).y)-NewPoint(i).x)

Case1

A(t,1)=0

A(t,2)=1

A(t,3)=Math.Sin(X0(4,1))*OldPoint(i).x+Math.

Cos(X0(4,1))*OldPoint(i).y

A(t,4)=(1+X0(3,1).ToScalarDouble)*(Math.Cos

(X0(4,1))*OldPoint(i).x-Math.Sin(X0(4,1))*Old-

Point(i).y)

F(t,1)=-(X0(2,1).ToScalarDouble+(1+X0(3,1).

ToScalarDouble)*(Math.Sin(X0(4,1))*OldPoint(i).x+

Math.Cos(X0(4,1))*OldPoint(i).y)-NewPoint(i).y)'

EndSelect

t=t+1

Next

Next

aa=MatrixLib.MatrixInv(A)’

调用矩阵求逆函数

V=MatrixLib.MatrixMultiplication(aa,F)’

调用矩阵乘法函

k=Math.Abs(V(4,1).ToScalarDouble*206265)

X=MatrixLib.MatrixAdd(X0,V)’

调用矩阵加法函数

t=1

Loop

迭代计算坐标转换参数结束

格式化显示计算结果

Label7.Text="X。="&Format(X(1,1).ToScalarDou-

ble,"0.000").ToString

Label8.Text="Y。="&Format(X(2,1).ToScalar-

Double,"0.000").ToString

Label9.Text="m="&Format(X(3,1).ToScalarDou-

ble,"0.000").ToString

Label10.Text="

θ

="&Format(X(4,1).ToScalarDou-

ble,"0.0").ToString

EndSub

PrivateSubButton1_Click(ByValsenderAsSystem.Object,

ByValeAsSystem.EventArgs)HandlesButton1.Click

DimP01,P02AsPointXY

DimP12,P12AsPointXY

P01.x=TextBox1.Text'36284.622'

P01.y=TextBox2.Text'198689.183

P02.x=TextBox3.Text'36306.259'

P02.y=TextBox4.Text'198815.462'

P11.x=TextBox5.Text'2732957.417'

P11.y=TextBox6.Text'502291.825'

P12.x=TextBox7.Text'2732980.935'

P12.y=TextBox8.Text'502417.691'

112

Callcsjs(P01,P02,P11,P12)

EndSub

城市勘测

2012

12

能力也很强

在公式推导时可以加快推导速度

但是在

这里由于篇幅有限就不多加叙述

参考文献

程序运行结果如图

5

所示

6

结语

[1]

孔祥元

,M].

武汉

:

武郭际明

刘宗泉

大地测量学基础

2001.

汉大学出版社

[2]

武汉测绘科技大学测量平差研究室

测量平差基础

[M].

武汉

:

武汉大学出版社

,1996.

[3]

杨永健

基于

.NET

平台的

MATLAB

应用程序集成研究

[J].

软件导刊

,2009.

[4]

董维国

深入浅出

MATLAB7.X

混合编程

[M].

北京

:

2005.

械工业出版社

[5]

洪一新

吴灿铭

.VisualBasic2008

程序设计完全自学教

M].

北京

:

清华大学出版社

,2009.

[6]

马莉

.MATLAB

语言实用教程

[M].

北京

:

清华大学出版

2010.

MATLAB

本文的编程环境为

VisualStudio2010、

R2009a

.NET3.5,

事实证明基于

.NET

VisualBas-

ic

调用

MATLAB

函数脱离

MATLAB

运行环境的混合

编程是可行的

在软件开发中

开发人员不再需要耗费

时间在编写数值分析

矩阵计算

科学数据可视化等函

数上

甚至也不需要了解很深的这方面的知识

把这一

切都交给

MATLAB

去做

大大提高了程序编写和科研

学习的效率

由于本文主要研究如何进行混合编程

因此本文的坐标转换参数的计算仅计算简单的

2

个公

共点的情况

若多于

2

个公共点

系数阵不能求逆

要采用最小二乘法进行平差计算及残差计算

剔除不

合格公共点

精度评定等

另外

MATLAB

的符号运算

ResearchonMixedProgrammingwithMATLAB

andVisualBasicBasedon.Net

QinZhao

(HechiComprehensiveTechnologyServiceCenterofUrbanPlanningSurveyingandMapping,Hechi547000,China)

Abstract:VisualBasicwhichhavethemostusersintheworldisahigh-levelprogramminglanguage,thedevelop-

erscanbuildsasoftwareeasilyandquicklybyit.MATLABhasstrongnumericalanalysis,matrixcalculationandsimula-

tionetc.Functions.NETreleasedbyMicrosoftisusedtoreplace.COMofanewgenerationofsoftwareinterfacetech-

nology.ThepaperwillintroducebytheexampleofcalculatingfourparametersofCoordinatetransformationhowtocom-

pletescientificresearchandengineeringcalculationbyprogrammingaVisualBasicprogramwhichcallsthefunctionsof

MATLABbasedon.NET.

Keywords:.NET;MATLAB;VisualBasic;MixedProgramming;SurveyingandMapping