利用MatrixVB实现MATLAB与VB混合编程简易教程Word格式.docx
《利用MatrixVB实现MATLAB与VB混合编程简易教程Word格式.docx》由会员分享,可在线阅读,更多相关《利用MatrixVB实现MATLAB与VB混合编程简易教程Word格式.docx(31页珍藏版)》请在冰豆网上搜索。
图7-2
选择标准EXE工程模板
(2)单击“打开”按钮,所建立的项目及开发界面如图7-3所示。
图7-3
VB项目及开发界面
3.为项目引入MatrixVB
在project下拉菜单中单击References,在弹出的对话框中选中MMatrix项目,系统将加载MatrixVB的动态链接库MMatrix.DLL,如图7-4所示。
图7-4
引入MatrixVB的动态链接库
3.2.2
在VB中使用MatrixVB的命令与函数
1.采用立即窗口的形式
在项目中引入MatrixVB库后,在VB中可以直接在开发环境的“立即窗口”中输入MATLAB命令,让VB编译器立即执行,如在MATLAB主窗口中一样。
在View下拉菜单的中选择ImmediateWindows选项在开发环境中得到“立即窗口”,如图7-5所示。
图7-5
VB中的立即窗口
例如,在“立即窗口”中输入如下命令:
A=eye(4,4)
A.show
命令将产生一个4行4列的单位矩阵,并在MatrixVB的观察窗口MatrixViewer中显示结果,如图7-6所示。
图7-6
在VB立即窗口中产生矩阵
或者,在“立即窗口”中输入命令:
mesh(peaks(3))
将在MatrixVB的图形窗口Figure1中绘制并显示一个曲面网线图,如图7-7所示。
图7-7
通过立即窗口绘制曲面图
2.在VB程序代码中使用
可以将MatrixVB的函数与命令调用嵌入到VB程序代码中实现相应的功能,其函数与命令的使用方式类似于在MATLAB环境中的使用方式。
例如,我们可以将上例中的功能在VB代码中实现,步骤为:
(1)在上例的主窗口中增加一个按钮,如图7-8所示。
图7-8
为窗口Form1增加按钮
(2)在按钮的Click事件处理过程中产生一个4行4列单位矩阵并显示,代码如下:
PrivateSubCommand1_Click()
A=eye(4,4)
A.Show
EndSub
单击命令按钮运行程序,运行结果如图7-9所示。
图7-9
VB代码中用MatrixVB产生矩阵
同样,在代码中也可以嵌入MatrixVB绘制图形的函数与命令,将该例按钮的Click事件处理过程中的代码进行如下修改。
PrivateSubCommand1_Click()
mesh(peaks(30))
运行结果如图7-10所示。
图7-10
通过嵌入MatrixVB命令绘图
在发布基于MatrixVB的VB应用程序时,应将相应的库文件随系统一起发布。
这些文件包括:
v4510v.dll、c4510v.dll、ago4510.dll、msvcrt.dll、msvcirt.dll和MMatrix.dll。
由于MMatrix.dll是COM服务器,所以必须在操作系统中注册后方可使用,注册时可使用如下命令行语句:
regsvr32mMatrix.dll
如果目标操作系统是Windows95,还必须发布另外两个OpenGL文件即opengl32.dll与glu32.dll,但在其他操作系统如Windows98/Me/NT4/2000等环境下,则不需要安装这些文件。
2.3
MatrixVB的矩阵操作
矩阵是表示一组数据关系的组合,在MatrixVB中包含了许多矩阵分析函数,为了在VB中直接应用MatrixVB这些高效的计算方法,一般将VB中的数组当成矩阵进行处理,需要说明的是与matricVB矩阵元素相关的运算在VB中对应的数据类型一般为double类型。
2.3.1
在VB中生成MatrixVB矩阵
可以像在MATLAB命令窗口中那样,直接在VB中定义MATLAB矩阵变量;
也可以使用VB的VARIANT通用型变量表示矩阵,其定义的方法如下:
DimxAsVariant
一般在VB中产生MatrixVB的方法主要有以下几种:
1.通过函数mabs转化为MatrixVB的矩阵
将VB中定义的数组通过函数mabs转化为MatrixVB的矩阵,格式为:
MATRIXVB_MATRIX=mabs(VB_ARRAY)
MATRIXVB_MATRIX为MatrixVB的矩阵名称,如同在MATLAB窗口中那样,不需要事先定义,VB_ARRAY是VB程序中定义的数组,也可以是单独的VB常量与变量。
修改图7-8中command按钮的Click事件的处理过程代码为:
DimA(1to3,1to3)
Asdouble
Dimi,jAsinteger
fori=1To3
forj=1To3
A(i,j)=CDbl(i+j)
Next
B=mabs(A)
A.show
EndSub
该段代码首先定义了一个二维VB数组A,然后将其赋值,通过mabs函数转化为MatrixVB矩阵B并将其显示出来。
运行程序并单击该按钮,运行的结果如图7-11所示。
图7-11
通过函数mabs产生的MatrixVB矩阵
2.通过MatrixVB函数生成矩阵
可以使用MatrixVB中的特殊函数(如zeros()、ones()、magic()等)直接生成矩阵。
如在VB程序代码中直接嵌入语句:
A=zeros(3,4)
结果将产生一个3行4列元素都为0的矩阵并将其显示出来。
在应用程序中我们也可以先定义变量,然后再赋值产生矩阵。
产生矩阵VB支持的两种类型为Matrix与Variant的如下语句,都将产生一个3×
4的0矩阵。
DimmatAsMatrix
Setmat=zeros(3,4)
'
赋值为3×
4的0矩阵
Setx=zeros(3,4)
3.通过函数CreateMatrix
通过函数CreateMatrix创建的矩阵可以在创建过程中直接赋值,格式为:
CreateMatrix(p1,p2,…,pn,)
p1,p2,…,pn为矩阵的值。
函数Reshape用来设置由函数CreateMatrix所创建的函数的维数,格式为:
Reshap(X,rows,cols)
X为由CreateMatrix创建的矩阵,rows为指定的行数,cols为指定的列数,
如下例所示:
A=CreateMatrix(1,2,3,4,5,6,7,8,9)
Reshap(A,3,3)
创建一个矩阵,并将其指定为3行3列,结果如图7-12所示。
图7-12
由CreateMatrix产生的MatrixVB矩阵
2.3.2
对矩阵元素进行操作
1.矩阵元素的存取及与VB的数据转换
(1)通过圆括号方式访问MatrixVB矩阵,但是这种方式只能对矩阵元素进行写操作,其格式如同访问VB的数组元素一样,例如:
A是一个二维矩阵则下列代码:
A(i,j)=2.0
可以将矩阵的第i行第j列赋值为1。
(2)MatrixVB矩阵属性rN、iN可以以读写的形式访问矩阵X中的每个元素的实部和虚部,其中N表示矩阵的维数,例如,对于一维MatrixVB矩阵A
A.r1(i)=12'
写操作
a=A.r1(i+1)'
读操作
将矩阵A的第i个元素赋值为12,将第i+1个元素赋值给VB中的变量a。
再如,对于二维矩阵B
B.r2(i,j)=12
a=B.r2(i,j)
将矩阵B的第i行j列元素赋值为12,将矩阵B的第i行第j列元素赋值给VB中的变量a,要通过iN的方式来访问。
(3)X.simple可以将MatrixVB矩阵X转换为VB中的数据类型。
在X为只有一个元素的矩阵情况下,若X为一个实数则将值转换为VB中的Double类型,如:
DimSAsDouble
A=CreateMatrix(1.0)
S=A.simple
若X为一个字符的单元素矩阵,则X.simple返回一个VB中的字符串类型;
若X为由多个元素的一维或者多维矩阵,则该表达式将返回一个矩阵,但不能自动转换为VB中相应的一维或者多维数组。
2.矩阵的显示
属性show具有打开Matrixviwer窗口显示矩阵内容的功能,格式为:
X.Show
3.获得矩阵的行、列、维数
利用函数rows()、cols()、dims()、dimension(n)返回矩阵的行数、列数、维数及第n维数的个数属性,与这些属性相关的VB中的数据类型一般为integer类型,如,对于二维矩阵A,下面的代码将得到矩阵的函数与列数,并将其赋值给VB中的变量。
a=A.rows()'
获得矩阵的行数
b=A.cols()'
获得矩阵的列数
c=dims()'
获得矩阵的维数
d=dimension
(1)'
第一维的个数
例如,在VB程序中产生一个MatrixVB矩阵并修改其元素的值,获得其属性并输出,修改图7-8中command按钮的Click事件的处理过程。
代码为:
'
定义变量用于接收MatrixVB中矩阵元素的值或属性值
DimxrAsdouble
DimxiAsdouble
DimiAsinteger
DimrowAsinteger
DimcolAsinteger
DimdimsAsinteger
A=zeros(3)'
产生一个3行3列的零矩阵
给矩阵赋值
A.show'
显示矩阵
xr=A.r2(2,2)'
获得矩阵2行2列的值
row=A.rows()'
获得行数
col=A.col()'
获得列数
dims=A.dims()'
获得维数
输出属性
Print"
行数为:
"
;
Print
row;
列数为:
col;
维数为:
EndSub
运行程序并单击command1按钮,结果如图7-13和7-14所示。
图7-13
图7-14
显示矩阵元素的值及属性
2.3.3
矩阵的保存与载入
使用vbsave命令将矩阵写入磁盘文件中,并将数据文件中保存的文件读到程序中。
语法格式分别为:
vbsavefilenamevariable
vbload(filename)
例如以下代码将产生的魔方矩阵A保存到文件magic.txt中,并读到B中
A=magic(3)
vbsave"
magic.txt"
A
B=vbload("
)
也可以使用MatrixVB提供的与C语言语法格式相似的函数来对特定格式的文件进行读写,把矩阵所有的元素都输出为一列,数据文件只能用Dos方式打开,如:
DimfidAsVariant
DimAAsVariant
DimBAsVariant
A=magic(4)
fid=fopen("
one.txt"
"
w"
Callfprintf(fid,"
%g\n"
A)
Callfscanf(fid,"
B)
fclose(fid)
2.3.4
应用举例
我们下面考虑将第5章中的计算器用MatrixVB来实现,并增加矩阵的行列式运算,LU分解。
(1)建立一个工程,工程名为Project1,工程类型为StandardEXE,如图7-15所示。
图7-15
新建VB工程
(2)按照7.2节步骤创建工程并设置环境。
(3)在主窗口上添加若干控件,如图7-16所示。
图7-16
应用主界面
各控件的类型、名称、标题及作用如表7-1所示:
表7-1
主窗口控件
控件类型
控件名称
标
题
作
用
Label
Label1
显示正在输入的行、列
TextBox
Text1
接受输入数据
ComboBox
Comb1
选择运算
选择运算类型
CommandButton
Command1
计算
执行运算命令
Command2
下一个
切换下一条数据输入
Command3
关闭
关闭主窗口
Command4
重置
清除主窗口中的打印内容
(4)声明模块级的变量。
定义保存原始数据的矩阵及表示当前行列的变量
DimmatAsVariant
DimiAsInteger
DimjAsInteger
(5)为主窗口Form的Load事件编写代码。
PrivateSubForm_Load()
Setmat=zeros(4,4)'
产生一个4×
4的零矩阵
向组合框增加计算选项字符串
Combo1.AddItem"
转置"
逆矩阵"
特征值"
LU分解"
SVD分解"
行列式"
i=1
j=1
(6)为Command2的Click事件处理过程编写代码。
PrivateSubCommand2_Click()
DimrowAsInteger
DimcolAsInteger
DimtempAsDouble
Label1.Caption="
当前行,列为"
&
CStr(i)&
"
CStr(j)
mat(i,j)=CDbl(Text1.Text)'
接收文本框中输入的数据到mat中
temp=CDbl(Text1.Text)
Printtemp;
将当前输入的数据输出
设置输出的行,列值,当行数大于4时输出结束
IfjMod4=0Then
i=i+1
j=1
Print
Else
j=j+1
EndIf
Text1.Text="
0"
Ifi=4Then
i=1
MsgBox"
输入已经结束"
Command2.Enabled=False
ExitSub
(7)为Command1的Click事件编写代码。
判断计算类型然后对mat矩阵进行相应的操作并将结果输出
IfCombo1.Text="
Then
A=transpose(mat)
ElseIfCombo1.Text="
B=inv(mat)
B.Show
C=eig(mat)
v=C
(1)'
C
(1)为特征值向量,C
(2)为主对角线为特征值的方阵
v.Show
D=lu(mat)
l=D
(1)'
D
(1)为下三角矩阵,D
(2)为上三角矩阵,D(3)为交换矩阵
l.Show
E=svd(mat)'
E[2]为对角线为奇异值的矩阵,E[1],E[3]为正交矩阵
v=E
(1)
F=det(mat)
PrintF.Simple'
将行列式的值输出到窗口上
EndIf
(8)为Command4的Click事件处理过程编写代码。
Form1.Cls
IfCommand2.Enabled=FalseThen
Command2.Enabled=True
此外读者可以尝试进行编程求矩阵的范数,秩等运算。
说明:
(1)与通过ActiveX自动化服务器方式相比,采用MatrixVB使得代码简练,它不需要在不同的环境中交换数据,也不必启动MATLAB的环境即可得到运算的结果。
(2)有些矩阵运算函数可以返回若干个矩阵,如LU分解等,一般可以通过X(n)方式来区分。
(3)有些针对一个二维矩阵的运算返回的是一个一维向量或单独的值,如矩阵的特征值或行列式值、范数等。
3.4
MatrixVB的运算符
VB不支持运算符的重载,例如“+”只能用于标量的加法运算,但在MatrixVB组件包中提供了一组函数用于扩展VB本身的运算符的适用范围,这些函数不仅能对MatrixVB矩阵进行算术运算,而且可以对VB支持的数据类型进行相同的运算,或者进行二者的混合运算。
因此这些函数相当于扩展了VB运算符的范围。
可以像使用MatrixVB组件包中其他函数一样对这些函数进行调用。
我们可以将MatrixVB运算符函数分为算术运算符函数、关系运算符函数和逻辑运算符函数等。
值得注意的是,虽然MatrixVB的这一组函数可以用于VB的某些数据类型的变量或常量,但VB的运算符却不能用于MatrixVB矩阵。
3.4.1
算术运算符
矩阵的算术运算符及与VB对应的运算符如表7-2所示。
表7-2
MatrixVB的算术运算符函数及与VB相关运算符的对应关系
VisualBasic
MatrixVB
MatrixVB运算函数说明
a^b
power(a,b)
a的b次方
a*b
times(a,b)
a乘b
a/b
rdivide(a,b)
a右除b
a\b
ldivide(a,b)
a左除b
aModb
mmod(a,b)
a对b求余
a+b
plus(a,b)
a加b
a-b
minus(a,b)
a减b
-a
uminus(a)
取a的每一个元素的相反数
(1)a和b可以都为VB所支持的整型,浮点型变量或者常量,运算的结果为MatrixVB标量矩阵,此时与VB的运算符所起的作用是一样的,如:
DimxAsDouble
DimyAsinteger
x=4.0
y=2
C=power(x,y)
C.Show
运算的结果为16,如图7-17所示。
图7-17
4.0的2次方