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
发布评论