VB调用MATLAB混合编程教程(完整版)
VB调用MATLAB步骤

a = Val(Text1.Text)
b = Val(Text2.Text)
Call hh.myadd(1, c, a, b) 'myadd为MATLAB中的函数名,1为输出变量个数,c为输出变量定义为variant型,a,b为输入变量,定义为double型
Y=a+b;
VB程序如下:
Private Sub Command1_Click()
Dim hh As New ABC.ab 'ABC 为COMPONENT NAME,ab为class name
Dim a As Double ‘输入参数
Dim b As Double ‘输入参数
3.matlab会列出所有电脑上所有的编译器,选择Microsoft Visual C/C++ version 6.0
4.The default location for Microsoft Visual C/C++ compilers is C:\Program Files\Microsoft Visual Studio, but that directory does not exist on this machine
Use C:\Program Files\Microsoft Visual Studio anyway [y]/n? 选择n
5.Please enter the location of your compiler: [C:\Program Files\Microsoft Visual Studio] 键入vc++6的安装位置E:\INSTALLBACK\Microsoft Visual Studio vc6.0
VB调用matlab

本来,VB与MATLAB混编的时候,我采用了VB+matrixVB的方法,常用的矩阵运算,是够用了的。
但是在处理矩阵的LU三角分解的时候,发现matrixVB的三角分解形为:PA=LU。
而非数值计算方法中的A=LU,想了半天,终于决定用matlab搞一下,发现在MATLAB中默认的LU分解就是matrixVB中的形式,于是狠狠心,自编函数,生成M文件,在MATLAB中终于实现了A=LU的三角分解,为了和VB混编,想到了com方法。
于是在MATLAB命令窗口中输入comtool ,调出combuilder,进行DLL的生成,结果呢,就这一个小小的念头,折腾了我一天。
才终于成功,下面把我的心得给大家分享一下。
1.环境(操作系统XP ,MATLAB7.0 ,VC++6.0)开始,我并没有装VC++6.0,结果在编译DLL时总是提示找不到编译器,当然了是英文提示,大概有这么一句“Could not find the compiler "cl" on the DOS path。
”后来我装了VS2005,问题同上,最后才装了VC++6.0,并在MATLAB命令窗口中输入mbuild –setup……………….省略多行提示 Would you like mbuild to locate installed compilers [y]/n?y(在此输入y) Select a compiler: [1] Lcc C version 2.4 in G:\MATLAB6P5\sys\lcc [2] Microsoft Visual C/C++ version 6.0 in G:\Microsoft VisualStudio [0] NoneCompiler: 2(在此输入2)…………省略多行提示Are these correct?([y]/n): y(在此输入y)然后就可以成功的编译DLL了。
我终于明白,原来这个编译器也是需要和MATLAB的版本匹配的。
五种VB与MATLAB混合编程接口的方法

摘要: 为充分发挥Matlab与VB各自的优势,将二者结合起来进行工程应用软件的开发。
本文介绍了五种VB与MATLAB混合编程接口的方法,并对各方法性能的优劣进行了比较和评价。
关键词: Matlab;Visual Basic;ActiveX;DDE;MatrixVB;DLL;COM1引言Microsoft Visual Basic是由微软公司开发的可视化编程语言之一,由于它简单易学的特点,只要稍有编程基础就可以很快掌握,可视化的用户界面设计功能,把程序设计人员从繁琐复杂的界面设计中解脱出来。
因而很快就风靡全球,是一种十分强大和有生命力的Windows 编程语言。
但是我们知道VB语言也有它的缺点,即对于数值计算方面其能力欠佳。
Matlab是Matlab 擅长处理数值计算和系统模拟仿真,已被广泛应用于数字信号处理、电力系统仿真、图像处理、系统识别等各个领域。
但是Matlab也存在一些缺点: 1、和其他高级程序相比,程序的执行速度较慢,那是因为;2、对于底层硬件操作以及编程界面方面远远比不上VB、VC 等软件。
鉴于二者各自的优势,为了提高工程软件的开发效率和质量,将两种软件结合起来进行工程应用软件的开发便成了实际的需要。
本文主要讨论VB与Matlab混合编程的几种方法。
2Vb和Matlab接口实现方法介绍2.1借助ActiveX技术ActiveX是特点就是使不同的软件对象可以跨进程、跨平台并能在网络上进行交互。
Matlab ActiveX自动化服务的功能主要包括在(1) Execute (Command as String) 方法: 执行本方法将调用MATLAB执行一条Command 字符串决定的Matlab命令,同时返回一条字符串表示命令的执行情况。
任何能在MATLAB命令行窗口执行的命令均可以被包括在Command 字符串中。
(2) GetFullMatrix方法: 该方法用来将Matlab中的一个矩阵变量传送到VB 程序的一个一维数组或二维数组中。
VB与Matlab混合编程

一、准备工作(1)matlab版本2012或以上(2)vb6.0二、适用条件matlab生成的无论是应用程序还是动态连接库或者是COM组件都需要MCR的支持,MCR因用户安装的Matlab版本不同分为32位和64位,所以为了能够将自己编译的M文件能够应用于其他的电脑上,首先要在目标电脑上安装自己电脑中MCR这个应用程序,它的存放位置为Matlab路径\ toolbox\compiler\deploy\win64三、Matlab与VB基于Com组件的实现过程(1)在Matlab中生成M文件的COM组件打开App菜单栏,找到Matlab Complier单击进入应用,会出现上图的界面,在Classes 中可以添加自己要用的类群,所谓的类群就是好比如果你想建立一个专门用于解决非线性方程的类,就可以建立个nonlinear equations solver,在类下可以添加用于解决非线性方程的各种M函数文件。
在这里我建立了fft类,在这个类中我添加了个myfft.M文件,这个M文件实际上使用了Matlab自带的离散傅立叶变换函数fft,这么做的目的是为了说明我们可以调用matlab已经建立好的各种算法,方便的在vb中调用。
添加好所需要的资源,点击build就OK了。
(2)注册生成的COM组件在Build Success后会在你选择生成Com组件的文件地址发现两个文件distrib和src,在distrib文件里你会发现你生成.dll文件,在电脑上注册它就可以在vb上调用。
至于怎么注册,自行脑补。
(3)在VB中调用Com组件在vb中的引用中通过浏览功能引用生成.dll文件,那么现在就可以使用了。
使用步骤:1.Dim xxx as new 工程名.类名xxx可以随意,工程名为你在Matlab中生成COM组件时自己定义的COM 组件名,类名为COM组件下你添加的类名2.通过xxx.函数名(nargout,y1,y2,y3,....,yn,x1,x2,...,xn)函数名为Matlab中定义在此类下的函数名,nargout为输出变量个数,y1,y2,...,yn 为输出变量,x1,x2,....,xn为输入变量。
VB调用Matlab的COM组件实现二者混合编程

* 2007-12-27收到,2008-04-05改回** 基金项目:国家863课题(编号:2006AA 10Z 260)资助。
***孟力力,女,1982年生,硕士研究生,研究方向:温室环境建模与可视化模型。
文章编号:1003-5850(2008)06-0024-03VB 调用Matlab 的COM 组件实现二者混合编程Hybrid Pr ogr amming by Using COM of Matlab in VB Software孟力力 杨其长(中国农业科学院农业发展与可持续发展研究所 北京 100081)【摘 要】Matlab 具有强大的计算和图形处理能力,VB 具有良好的用户界面,将二者有机结合,可开发出功能强大的软件。
介绍了常见的五种方法。
为了使开发的VB 程序脱离Matlab 环境,详细介绍了一种基于组件对象模型(COM)的Matlab 与VB 混合编程方法,以COM Builder 为转换工具,将Matlab 函数文件转换为COM 组件,在VB 程序中调用这个组件。
并通过温室热环境模拟可视化模型的实现说明此方法。
【关键词】VB,Matlab,COM 技术,可视化模型中图分类号:TP 311.11文献标识码:AABSTRACT Matlab has power ful calculating and gr aphic pr ocessing ability ,VB has good user inter face .T he softwar e with powerful functions is developed based on combination of the above.Five methods are intr oduced in this paper.In or der to develop the VB pr ogr am wit hout Matlab environm ent ,the met hod based on COM is intr oduced in det ail.By mea n of Mat lab COM builder ,Matlab's function files can be converted into a COM component,which is applied in t he VB.The met hod is demonstr ated by implement ation of visual simulation model of gr eenhouse ther mal envir onment.KEYWORDS VB ,M atla b ,COM builder ,visual m odel Microsoft Visual Basic 是由微软公司开发的在Windows 操作平台上的主力编程语言之一,具有良好的可视化界面、程序集成化程度高、易学易用等特点,因而一经推出就风靡全球,是一种十分强大和有生命力的Windows 编程语言。
VS2008与MATLAB2010b混合编程

VS2008与MATLAB2010b混合编程环境目录设置:第一步:通过菜单工具/选项,打开选项页,点击项目和解决方案,然后在页面右面“显示以下内容的目录”下拉列表框中选择“包含文件”,添加路径:"D:\Program files\MATLAB\R2010a\extern\include"。
第二步:选择“库文件”,添加路径:D:\Program Files\MATLAB\R2010a\extern\lib\win32\microsoft以上步骤1)、2)只需设置一次,因为是对VS2008整体工作环境的设置。
3) 右击工程/属性,打开项目属性页,选择链接器/输入,在附加依赖项编辑框中,添加文件名libmx.lib libmat.lib libeng.lib。
4)如此设置后,能够正常编译,但运行时报错说找不到dll文件,如下而libmx.dll是存在于D:\Program Files\MATLAB\R2010a\bin\win32文件夹中,而在Win7系统变量里Matlab在安装的时候时只写入了路径D:\Program Files\MATLAB\R2010a\bin,故系统不会自动到其子文件中找dll,从而报错说找不到文件,这也解释了为什么旧版本的Matlab无此问题,因为可能旧版本的Matlab中没有将这些dll分离放到win32子文件夹中。
所以只要在系统变量中包含路径D:\Program Files\MATLAB\R2010a\bin\win32即可。
设置路径:我的电脑->(右击)属性->高级->环境变量->新建变量名:Path变量值:D:\Program Files\MATLAB\R2010a\bin\win32如果以上设置完成后,运行仍报错,可以尝试将VS2008关掉再启动,我就是这样,环境变量设置好后,仍然报错,重启电脑也解决不了问题,后尝试关掉工程,再启动运行就OK了!项目目录设置:第一步:添加生成的动态链接库文件第二步:选择项目->项目属性。
Matlab与VB混合编程

3、生成COM组件
(1)设置系统路径
我的电脑属性 高级 环境变量 系统变量 Path选项,增加以下路径:
头文件:C:/MATLAB7/extern/include;
库:C:/MATLAB7/extern/lib/win32/microsoft/msvc60; DLL:C:/MATLAB7/bin/win32
,在算法上采用C++语句,所以运行速度较快,可应用于实时运算
。通过这种方法可以发布成脱离MATLAB和VB的安装软件, 在其他没有安装MATLAB和VB软件的计算机上都能运行。
8 /23
实现步骤(一) Matlab7.1 版
1、开发环境: Visual Studio 6.0 Matlab7.1安装路径不能有空格或中文 2、编写m文件 (注:m文件必须为m函数,不能是脚本文件) function plotcur x=0:0.01:2*pi; y=sin(x); set(gcf,'visible','off'); plot(y) print -dmeta; close(gcf);
1 /23
主要内容
一、 ActiveX技术 二、 动态链接库(DLL)
实现步骤(一) Matlab7.1 版
开发环境 编写m文件 生成COM组件 VB中调用动态链接库
应用程序发布
应用程序安装
实现步骤(二) Matlab2013a 版
2 /23
一、 ActiveX技术
ActiveX自动化协议是一种允许一个应用程序 或组件去控制另一个应用程序或组件的协议,VB和 MATLAB都支持ActiveX自动化协议。通过自动化 协议,可以在VB应用程序中执行MATLAB命令, 并从的MATLAB工作空间中获取数据以及向 MATLAB输送数据从而实现数据的交互。要实现这 种功能,用户首先必须获得Matlab ActiveX对象在 系统注册表中定义的名字─Matlab.Application。
Matlab与VB混合编程

*打开生成的安装包中的
setup.Lst文件,[Bootstrap Files]字段里面只保留 VB6STKIT.DLL和 msvbvm60.dll几个文件, 其余的都删掉,否则在不同 版本的系统上使用可能会 报错。
16 /23
6、应用程序安装 (1)安装VB应用程序。在要安装的计算机上,新建一 个文件夹作为应用程序的安装目录。将打包好的VB程序 中的压缩包(.CAB)解压到安装目录中再进行安装。 ( 2 )安装 Matlab 控件。运行 COM 组件包中的 distrib 文 件夹下的类名.exe文件,运行过程中全部按“y”覆盖原 文件。将安装目录指向VB应用程序安装所在的目录(即 VB应用程序与Matlab控件安装在同一个目录下),否则 dll文件是没有办法注册的,选择后,全部点击Next,至 Matlab Component Runtime安装完成,DOS安装界面也 会随后自动关闭。
,在算法上采用C++语句,所以运行速度较快,可应用于实时运算
。通过这种方法可以发布成脱离MATLAB和VB的安装软件, 在其他没有安装MATLAB和VB软件的计算机上都能运行。
8 /23
实现步骤(一) Matlab7.1 版
1、开发环境: Visual Studio 6.0 Matlab7.1安装路径不能有空格或中文 2、编写m文件 (注:m文件必须为m函数,不能是脚本文件) function plotcur x=0:0.01:2*pi; y=sin(x); set(gcf,'visible','off'); plot(y) print -dmeta; close(gcf);
编译
编译过程
21 /23
4、生成自解压安装包 在本地使用的话,MATLAB会自动注册 COM 组件,无需发布;但如果要在没有安装 MATLAB的计算机上使用,安装包就需添加 MATLAB运行库MCR。点击PackageAdd MCR
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
VB与MATLAB混合编程探讨
摘要:介绍了VB与MATLAB混合编程的方法,二者结合可以充分利用VB的方便快捷和MATLAB软件工具箱的强大功能。
关键词:VBVC++MATLABDLL编译MATLABAdd-inMATLAB是MathWorks公司开发的科学计算环境,具有强大的计算绘图能力,提供大量的函数库、工具箱,几乎涵盖了所有的工程计算领域,被誉为“演算纸”式的工程计算工具。
但是MATLAB语言是一种解释执行的脚本语言,运算速度较慢是一个比较突出的问题。
VisualBasic作为一门易学易用的编程语言,受到很多工程技术人员的青睐,其执行速度相对较快,界面友好。
因此实现VB与MATLAB混合编程,可以为科研工作和工程应用提供有力的技术支持。
1基本思路及实现方法
MATLAB提供了与C++、Fortran的程序接口,并没有提供直接与VB的接口。
目前VB与MATLAB混合编程方面主要使用以下一些方法:
(1)在VB中通过调用MATLAB的引擎(Engine)接口,使用Windows的OLE或ActiveX通道与MATLAB通信。
通过Object.Execute MATLAB语句在程序中直接使用MATLAB提供的函数库和图形库。
这种方法可以较快地编写出程序;但在调用引擎时,会在后台启动一个MATLAB进程,影响程序运行速度,占用内存。
(2)通过使用嵌入VB的矩阵函数库MatrixVB的方法。
MatrixVB是由原MathTools公司开发的第三方插件,利用与MATLAB相似的函数、语法嵌入到VB中,可以象使用VB的函数、命令一样使用MATLAB函数。
这种方法语法和函数使用比较简单,编程效率很高,几乎完全融入VB语言,特别对图形的处理非常方便,弥补了其他方法在图形处理上的弱点。
安装后,只需在打开的工程中添加MatrixVB库
即可(在工程->引用对话框中选中MMatrix)。
但由于其仍然采用解释执行,执行效率较低,实时运算难以实现。
(3)借助VisualC++与MATLAB的接口,将MATLAB的程序文件(.M)编译为动态链接库(.DLL),VB在代码中调用生成的.DLL中的函数,实现算法,便于用户脱离MATLAB环境使用。
由于算法部分采用C++语句,运行速度较快,可应用于实时运算。
这种方法对开发者在设置和编程上有一定要求,本文将详细阐述具体实现步骤。
其基本思路如图1所示。
第一步,编写M文件。
在MATLAB中打开Editor,按照MATLAB程序格式输入代码,实现算法,调试成功。
注意:M文件必须以Function开始,避免在VC++中出现转换错误。
第二步,使用MATLAB6.0新提供的编译插件MATLABAdd-in在VC++中转换为C文件。
在转换前做好MATLAB与VC++的接口连接。
步骤如下:·在MATLAB中运行“mex-setup”,选择MicrosoftVisualC/C++version6.0选项,安装MATLABAdd-in文件到VC++目录,确认;接着运行“mbuild-setup”,选择MicrosoftVisualC/C++version6.0作为本地默认编译器;然后在MATLAB下运行“cd prefdir”和“mccsavepath”命令,MATLABAdd-in可以脱离MATLAB环境找到MATLAB路径。
·在VC++中选择“工具 tools->定制(customize)->附加项和宏文件 Add-insandMacroFiles页”,选中“MATLABAdd-in”。
这样,在VC++工具栏出现MATLABAdd-in图标,在VC++
新建工程对话框中会出现“MATLABProjectWizard”。
至此连接工作完成。
·打开VC++,在新建工程中选择“MATLABProjectWizard”,按照提示,选择“ShalledM-dll”,输入M文件位置,VC++开始转换。
如果M文件没有错误,在工程文件夹中会生成一系列.C文件。
其中与M文件同名的.C文件即为转换的C代码。
第三步,编译DLL文件(强烈建议不要对刚刚生成的C代码作任何修改)。
选择“编译”菜单,构建.DLL文件,在文件夹中会生成与工程名相同的DLL文件。
第四步,在VB中调用DLL文件。
在第二步生成的C代码中找到所要的接口函数,注意大小写,记下函数名。
在VB中使用Declare语句声明这个函数。
在窗体的“通用-声明”输入如下语法:
DeclareFunction/Sub<函数名>Lib“<dll文件名>”Alias“<函数名>” <参数表>as<type>(具体语法可参看VB使用手册)。
在程序代码中直接调用声明的函数即可。
需要注意的是函数调用过程中的参数传递问题。
由于VB和C的数据类型以及参数传递形式不太一样,传递不当,可能会造成调试困难。
特别是MATLAB中用到的大量矩阵(数组)参数,调用需十分当心。
本文在下面例子中采用文件方式传递参数,利用VB和MATLAB的文件读写功能传递数组参数,对于实时性要求不高的应用,可以方便稳妥地实现数据传递。
2应用举例
在VB中利用随机数生成16个10以内的整数,作为一个信号序列,利用MATLAB的快速傅立叶变换函数(FFT())对序列进行变换,再将变换结果传递回VB,并显示在窗体上。
在MATLAB中编辑好M文件(test.m),实现读取序列文件及FFT并写回序列文件,调试成功。
代码如下:
functiont
fid=fopen 't.txt' 'rt+' %以读写文本方式打开文件
acount =fscanf fid '%d' %文件以整数格式读入矩阵a
m=fft a count %FFT运算
frewind fid %文件指针指向文件头
fprintf fid '%f\n' m %向文件写入矩阵m
fclose fid
按照前述步骤在VC++中转换为test.c文件,找到接口函数,本例为mlfTest()。
voidmlfTest(void){
mlfEnterNewContext(0,0);
Mtest();
mlfRestorePreviousContext(0,0);
}
编译生成test.dll文件。
在VB中生成随机序列并写入文件:
PrivateSubCommand1_Click()
Randomize
DimiAsInteger
DimaAsInteger
DimbAsString
Text1.Text=″″
OpenApp.Path&″\t.txt″ForOutputAs#1
Fori=1To16
a=Int(10*Rnd)
Print#1,LTrim(a)
b=b&Str(a)&Chr(13)&Chr(10)
Nexti
Text1.Text=b
Close#1
EndSub
声明mlfTest()函数:
PrivateDeclareSubmlfTestLib″G \test\dll\dll.dll″
调用该函数的事件代码:
PrivateSubCommand2_Click()
MlfTest'调用函数
EndSub
本例中未向函数传递参数,也无需函数返回运算结果,故采用调用子程序过程(Sub)方式直接调用。
结果由VB读取文件获得:
PrivateSubCommand3_Click()
Dimstr1AsString
Dimstr2AsString
Text2.Text=″″
OpenApp.Path&″\t.txt″ForInputAs#1
DoWhileNotEOF 1
LineInput#1 str1
str2=str2&str1&Chr(13)&Chr(10)
Loop
Text2.Text=str2
Close#1
EndSub
本例在WindowsXP、VB6.0、VC++6.0、MATLAB6.5下调试通过。
VB与MATLAB的混合编程,可以脱离MATLAB环境运行,有利于程序发布及使用。
通过二者结合,减少了设计算法的时间,降低了编程难度,同时兼顾了代码安全和界面友好。
程序界面如图2所示。