MATLAB与VB混合编程方式简易教程讲解.docx

上传人:b****6 文档编号:13321636 上传时间:2023-06-13 格式:DOCX 页数:32 大小:254.92KB
下载 相关 举报
MATLAB与VB混合编程方式简易教程讲解.docx_第1页
第1页 / 共32页
MATLAB与VB混合编程方式简易教程讲解.docx_第2页
第2页 / 共32页
MATLAB与VB混合编程方式简易教程讲解.docx_第3页
第3页 / 共32页
MATLAB与VB混合编程方式简易教程讲解.docx_第4页
第4页 / 共32页
MATLAB与VB混合编程方式简易教程讲解.docx_第5页
第5页 / 共32页
MATLAB与VB混合编程方式简易教程讲解.docx_第6页
第6页 / 共32页
MATLAB与VB混合编程方式简易教程讲解.docx_第7页
第7页 / 共32页
MATLAB与VB混合编程方式简易教程讲解.docx_第8页
第8页 / 共32页
MATLAB与VB混合编程方式简易教程讲解.docx_第9页
第9页 / 共32页
MATLAB与VB混合编程方式简易教程讲解.docx_第10页
第10页 / 共32页
MATLAB与VB混合编程方式简易教程讲解.docx_第11页
第11页 / 共32页
MATLAB与VB混合编程方式简易教程讲解.docx_第12页
第12页 / 共32页
MATLAB与VB混合编程方式简易教程讲解.docx_第13页
第13页 / 共32页
MATLAB与VB混合编程方式简易教程讲解.docx_第14页
第14页 / 共32页
MATLAB与VB混合编程方式简易教程讲解.docx_第15页
第15页 / 共32页
MATLAB与VB混合编程方式简易教程讲解.docx_第16页
第16页 / 共32页
MATLAB与VB混合编程方式简易教程讲解.docx_第17页
第17页 / 共32页
MATLAB与VB混合编程方式简易教程讲解.docx_第18页
第18页 / 共32页
MATLAB与VB混合编程方式简易教程讲解.docx_第19页
第19页 / 共32页
MATLAB与VB混合编程方式简易教程讲解.docx_第20页
第20页 / 共32页
亲,该文档总共32页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

MATLAB与VB混合编程方式简易教程讲解.docx

《MATLAB与VB混合编程方式简易教程讲解.docx》由会员分享,可在线阅读,更多相关《MATLAB与VB混合编程方式简易教程讲解.docx(32页珍藏版)》请在冰点文库上搜索。

MATLAB与VB混合编程方式简易教程讲解.docx

MATLAB与VB混合编程方式简易教程讲解

3.1 MATLAB与VisualBasic

语言的混合编程方式

MATLAB提供了与C/C++、Fortran语言的接口,但没有与VsiualBasic语言的接口,要想实现MATLAB与VisualBasic的混合编程可以通过以下途径来实现。

1.通过ActiveX方式

一是用VisualBasic开发服务器ActiveX组件,MATLAB作为客户端程序使用,事实上无论是用VB还是VC或者其他语言环境开发的ActiveX组件,对于MATLAB来说集成与调用方式是一样的,一般情况下很容易地将不同环境下开发的用途各异的ActiveX对象集成到一个MATLAB应用中来。

其使用方法见第5章关于MATLAB作为ActiveX的客户端使用方法。

二是在VB环境下可以通过ActiveX自动化接口将MATLAB作为VisualBasic语言的一个ActiveX部件调用。

MATLABActiveX自动化服务的功能主要包括在MATLAB工作空间执行MATLAB命令,以及直接从工作空间存取矩阵等,我们在第5章中关于MATLAB作为服务器组件的部分的例子就是以VisualBasic应用程序,以MATLAB作为服务器客户端的。

2.通过动态链接库方式

该种方式是一种间接调用MATLAB命令的方式,借助于C++与MATLAB的接口,将MATLAB的程序文件(.M文件)编译为动态链接库(.DLL),VB在代码中与调用其他语言编写的DLL文件一样调用MATLAB中.M文件生成的动态链接库。

这种方法可以脱离具体的MATLAB环境,运行效率较高。

3.通过嵌入VB的矩阵函数库MatrixVB的方法

MatrixVB是由第三方(mathtools公司)提供的COM组件,包含了大量与MATLAB相似的函数与调用语法,可以加强VB内建数学运算与图形展示功能,在VB程序代码中可以像使用VB自己的函数一样使用MatrixVB的函数,而且可以不依赖于MATLAB的环境在VisualBasic中完成矩阵运算与图形绘制显示等功能,这种方法使用起来简单,编程效率较高。

MatrixVB函数库的功能大致可分为8大类(矩阵运算、运算符重载、图形图像处理、最优化运算、多项式、信号处理、随机与统计分析、控制系统)。

除以上3种方式外,我们还可以通过DDE的方式实现VB与MATLAB的数据通信。

3.2 MatrixVB环境设置

3.2.1 在VB应用中引入MatrixVB

1.安装MatrixVB

(1)系统要求为:

●    硬盘空间8.8M以上;

●    操作系统要求Windows95及其以上版本,或者WindowsNT4.0及其以上版本。

(2)在安装盘上找到Matrixvb4510.exe,双击后启动安装程序,并按照安装向导安装。

(3)然后在“开始→运行”菜单中用命令regsvr32mMatrix.dll注册,如图7-1所示。

图7-1 注册MatrixVb

2.建立EXE项目

(1)启动VB开发环境并建立“标准EXE”项目,如图7-2所示。

图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))

EndSub

运行结果如图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事件的处理过程代码为:

PrivateSubCommand1_Click()

DimA(1to3,1to3) Asdouble

Dimi,jAsinteger

fori=1To3

forj=1To3

A(i,j)=CDbl(i+j)

Next

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)

A.show

结果将产生一个3行4列元素都为0的矩阵并将其显示出来。

在应用程序中我们也可以先定义变量,然后再赋值产生矩阵。

产生矩阵VB支持的两种类型为Matrix与Variant的如下语句,都将产生一个3×4的0矩阵。

DimmatAsMatrix

DimxAsVariant

Setmat=zeros(3,4)             '赋值为3×4的0矩阵

Setx=zeros(3,4)            '赋值为3×4的0矩阵

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)

     A.Show

创建一个矩阵,并将其指定为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事件的处理过程。

代码为:

PrivateSubCommand1_Click()

'定义变量用于接收MatrixVB中矩阵元素的值或属性值

DimxrAsdouble

DimxiAsdouble

DimiAsinteger

DimrowAsinteger

DimcolAsinteger

DimdimsAsinteger

A=zeros(3)'产生一个3行3列的零矩阵

'给矩阵赋值

fori=1To3

 forj=1To3

A(i,j)=CDbl(i+j)

Next

Next

A.show'显示矩阵

xr=A.r2(2,2)'获得矩阵2行2列的值

   row=A.rows()'获得行数

   col=A.col()'获得列数

dims=A.dims()'获得维数

'输出属性

Print"行数为:

";

Print row;

Print"列数为:

";

Print col;

Print"维数为:

";

Print 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("magic.txt")

也可以使用MatrixVB提供的与C语言语法格式相似的函数来对特定格式的文件进行读写,把矩阵所有的元素都输出为一列,数据文件只能用Dos方式打开,如:

DimfidAsVariant

DimAAsVariant

DimBAsVariant

A=magic(4)

fid=fopen("one.txt","w")

Callfprintf(fid,"%g\n",A)

Callfscanf(fid,"%g\n",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

Label1

显示正在输入的行、列

TextBox

Text1

接受输入数据

ComboBox

Comb1

选择运算

选择运算类型

CommandButton

Command1

计算

执行运算命令

CommandButton

Command2

下一个

切换下一条数据输入

CommandButton

Command3

关闭

关闭主窗口

CommandButton

Command4

重置

清除主窗口中的打印内容

                      

(4)声明模块级的变量。

'定义保存原始数据的矩阵及表示当前行列的变量

DimmatAsVariant

DimiAsInteger

DimjAsInteger

(5)为主窗口Form的Load事件编写代码。

 PrivateSubForm_Load()

 Setmat=zeros(4,4)'产生一个4×4的零矩阵

 '向组合框增加计算选项字符串

Combo1.AddItem"转置"

Combo1.AddItem"逆矩阵"

Combo1.AddItem"特征值"

Combo1.AddItem"LU分解"

Combo1.AddItem"SVD分解"

Combo1.AddItem"行列式"

i=1

j=1

EndSub

(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

 j=1

  Text1.Text=""

 MsgBox"输入已经结束"

  Command2.Enabled=False

 ExitSub

 EndIf

EndSub

(7)为Command1的Click事件编写代码。

'判断计算类型然后对mat矩阵进行相应的操作并将结果输出

PrivateSubCommand1_Click()

 IfCombo1.Text="转置"Then

 A=transpose(mat)

 A.Show

ElseIfCombo1.Text="逆矩阵"Then

 B=inv(mat)

 B.Show

ElseIfCombo1.Text="特征值"Then

C=eig(mat)

v=C

(1)'C

(1)为特征值向量,C

(2)为主对角线为特征值的方阵

v.Show

ElseIfCombo1.Text="LU分解"Then

D=lu(mat)

l=D

(1)'D

(1)为下三角矩阵,D

(2)为上三角矩阵,D(3)为交换矩阵

l.Show

ElseIfCombo1.Text="SVD分解"Then

E=svd(mat)'E[2]为对角线为奇异值的矩阵,E[1],E[3]为正交矩阵

v=E

(1)

v.Show

ElseIfCombo1.Text="行列式"Then

F=det(mat)

PrintF.Simple'将行列式的值输出到窗口上

EndIf

EndSub

(8)为Command4的Click事件处理过程编写代码。

i=1

j=1

Form1.Cls

IfCommand2.Enabled=FalseThen

   Command2.Enabled=True

EndIf

此外读者可以尝试进行编程求矩阵的范数,秩等运算。

说明:

(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次方

(2)a与b都为MatrixVB矩阵,此时二者的维数、大小均要一致,所做的运算为二个矩阵对应元素的运算,如:

A=CreateMatrix(1,2,3,4,5,6,7,8,9)

B=CreateMatrix(2,2,2,3,3,3,4,4,4)

A=reshape(A,3,3)

B=reshape(B,3,3)

C=power(A,B)

C.Show

结果将产生一个矩阵C,其中任一元素C(i,j)的值为A矩阵对应元素A(j,i)的B(j,i)次方,计算结果如图7-18所示。

图7-18 矩阵A的B次方

(3)a与b中一个为MatrixVB矩阵,一个为VB中的数据类型(整型,浮点型)的标量,所做的运算为该标量对矩阵每个元素的算术运算,如:

A=Crea

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2