编程语言matlab

2024-08-29

编程语言matlab(共10篇)

编程语言matlab 篇1

1. 引言

MATLAB是一种广泛应用于工程计算及数值分析领域的新型高级语言, 它以矩阵为数据操作基本单位, 使得矩阵运算变得非常简洁、方便、高效。在各高等院校, MATLAB已经成为线性代数、自动控制理论、数字信号处理、时间序列分析、图像处理等许多课程的基本教学工具, 成为大学生、研究生必须掌握的编程语言[1]。

MATLAB已经占据了数值软件市场的主导地位, 已经发展成为多学科多种工作平台的功能强大的数值计算及数值分析软件, 被誉为“巨人肩上的工具”[2]。

在MATLAB教学过程中, 我们发现初学者对MATLAB安装和三种结构编程理解不是很透, 容易出错。很多教材和参考资料对这些方面的介绍也不是很详细, 而掌握这两个方面对后续的学习和运用特别重要。

学生对上述两个方面理解透彻后, 就可以从绘图和数据分析两个方面来体会MATLAB软件的高效性和强的绘图能力。

2. MATLAB软件的安装

在教学中使用MATLAB 7.0, 由于MATLAB 2007版本和MATLAB 2009版本所需要的系统资源较大, 而MATLAB 7.0安装文件在1G左右, 因此通常使用MATLAB 7.0进行教学。在安装中特别要注意MATLAB 7.0与电脑CPU的厂家有密切联系, 即如果CPU是Intel公司的, 那么与MATLAB 7.0是兼容的, 但是如果CPU是AMD公司的, 那么需要在安装的时候修改环境变量, 这一点在教学中需提醒学生注意。

3. MATLAB的编程教学

3.1 矩阵

MATLAB, 即“矩阵实验室”, 它是以矩阵为基本运算单元。MATLAB的强大功能之一体现在能直接处理向量或矩阵。当然首要任务是输入待处理的向量或矩阵。不论是任何矩阵 (向量) , 我们都可以直接按行方式输入每个元素:同一行中的元素用逗号 (, ) 或者用空格符来分隔, 且空格个数不限;不同的行用分号 (;) 分隔。所有元素处于一方括号 ([]) 内;当矩阵是多维 (三维以上) , 且方括号内的元素是维数较低的矩阵时, 会有多重的方括号。

如:

矩阵是MATLAB最基本也是最简单的部分。

3.2 MATLAB的三种结构编程

MATLAB程序设计既有传统高级语言的特征, 又有自己独特的特点。编程总是由简单到复杂, 要掌握编程语言, 需先练习编程的顺序、选择、循环三种结构[2]。

首先是顺序结构。学生在学习MATLAB语言之前有C语言的基础, 在实际的教学过程中, 必须提醒学生, MATLAB语言与C语言的一个显著的区别是, MATLAB语言是顺序执行的, 在编程中, 即使同一个程序使用相同的变量, 这个变量也可以进行几次赋值, 但是不推荐使用。

其次是选择结构。MATLAB的选择结构由if语句构成, 最简单的If-Else-End结构是:

如果在表达式中的所有元素为真 (非零) , 那么就执行i和end语言之间的{commands}。对于if语句, 与其搭配的是elsei语句, 注意elseif之间没有空格, 这一点在教学中需提醒学生注意。

最后是循环结构。MATLAB的循环结构使用for语句或者while语句。for循环允许一组命令以固定的和预定的次数重复。for循环的一般形式是:

在for和end语句之间的{commands}按数组中的每一列执行一次。

在for语句的使用中, 注意对循环变量的步进值的确定, 例如语句for i=0∶0.1∶1, 就是指变量i的步进值是0.1, 即i的取值是[0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1]。

与for循环以固定次数求一组命令的值相反, while循环以不定的次数求一组语句的值。while循环的一般形式是:

while expression

只要在表达式里的所有元素为真, 就执行while和end语句之间{commands}。

上述的顺序、选择和循环三种结构可以嵌套使用, 例如循环语句常与选择语句嵌套使用。

3.3 MATLAB的绘图功能

MATLAB另一个重要特色就是MATLAB具有方便实用的绘图功能。MATLAB有两类绘图命令, 一类是直接对图形句柄进行操作的底层绘图命令, 另一类是在底层命令的基础上建立起来的高层绘图命令。

MATLAB可以表达出数据的二维, 三维, 甚至四维的图形。通过图形的线型, 立面, 色彩, 光线, 视角等属性的控制, 可把数据的内在特征表现得淋漓尽致。

二维图形比较简单, 用plot函数可以画出。在此主要介绍三维图形的绘图。三维图形分为曲线和曲面两种, 对于MATLAB中绘制三维图形可以用“三维线图”命令plot3函数, 该函数允许用户在三维空间内绘制三维图形。除了plot3函数可以绘制三维图形外, 还有一些函数可以用来绘制三维线图和曲面图。能通过简单的命令绘制三维曲面图形, 例如绘制|y|≤3的图形的程序表达如下:[x, y]=meshgrid (-3∶0.1∶3) ;z=-5. ( (x.^2+1) +y*0) ;surf (x, y, z) ;输出图形如图1所示。

从图1可以看出, 曲面图为彩色图形, 并且着色均匀, 如果想要得到黑白图形, 只要把程序表达式改为:[x, y]=meshgrid (-3∶0.01∶3) ;z=-5/ ( (x^2+1) +y*0) ;surf (x, y, z) ;运行此命令后, 输出图形如图2所示。可以看出, MATLAB绘图简便直观, 能够激发学生的学习兴趣, 提高课堂教学效果。

3.4 MATLAB的数据分析功能

在科学计算中, MATLAB可以用于数据分析, 例如MAT-LAB可以将数据进行统计处理, 例如需要求出数据的平均值、方差、最大值、最小值等, 只需要使用mean、std、max、min等函数, 使用简便并且非常快捷。例如:利用MATLAB提供的rand函数生成2000个符合均匀分布的随机数, 然后检验随机数的性质:均值和标准方差;最大元素和最小元素;大于0.6的随机数个数占总数的百分比。可以编写程序如下:

4. 结语

本文在此讨论了MATLAB安装教学和编程教学中有关矩阵、程序结构、画图、数据分析方面的注意问题。我们可以看出, MATLAB作为编程工具, 避免了繁琐的底层编程, 从而可以把主要精力和时间花在科学研究和解决实际问题上。

摘要:本文对MATLAB的编程进行了教学方面的讨论, 提出了教学过程中的需要注意的问题。并且通过对MATLAB编程的讨论, 得出MATLAB具有绘图功能强、命令简单与效率高的特色, 能够使学生激发学习兴趣并且提高课堂教学效果的结论。

关键词:MATLAB编程,绘图,数据分析

参考文献

[1]刘卫国.MATLAB程序设计教程[M].中国水利水电出版社, 2005.

[2]李光华, 李早水.基于MATLAB编程的实验教学中学生的探索思维研究[J].哈尔滨职业技术学院学报, 2009:51-52.

编程语言matlab 篇2

摘要:介绍了VB与MATLAB混合编程的方法,二者结合可以充分利用VB的方便快捷和MATLAB软件工具箱的强大功能。

关键词:VB VC++ MATLAB DLL 编译 MATLAB Add-in

MATLAB是MathWorks公司开发的科学计算环境,具有强大的计算绘图能力,提供大量的函数库、工具箱,几乎涵盖了所有的工程计算领域,被誉为“演算纸”式的工程计算工具。但是MATLAB语言是一种解释执行的脚本语言,运算速度较慢是一个比较突出的`问题。

Visual Basic作为一门易学易用的编程语言,受到很多工程技术人员的青睐,其执行速度相对较快,界面友好。因此实现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)借助Visual C++与MATLAB的接口,将MATLAB的程序文件(.M)编译为动态链接库(.DLL),VB在代码中调用生成的.DLL中的函数,实现算法,便于用户脱离MATLAB环境使用。由于算法部分采用C++语句,运行速度较快,可应用于实时运算。这种方法对开发者在设置和编程上有一定要求,本文将详细阐述具体实现步骤。其基本思路如图1所示。

第一步,编写M文件。在MATLAB中打开Editor,按照MATLAB程序格式输入代码,实现算法,调试成功。注意:M文件必须以Function开始,避免在VC++中出现转换错误。

第二步,使用MATLAB6.0新提供的编译插件MATLAB Add-in在VC++中转换为C文件。在转换前做好MATLAB与VC++的接口连接。步骤如下:

・在MATLAB中运行“mex -setup”,选择Microsoft Visual C/C++ version 6.0选项,安装MATLAB Add-in文件到VC++目录,确认;接着运行“mbuild -setup”,选择Microsoft Visual C/C++ version 6.0作为本地默认编译器;然后在MATLAB下运行“cd?prefdir?”和“mccsavepath”命令,MATLAB Add-in可以脱离MATLAB环境找到MATLAB路径。

・在VC++中选择“工具?tools?->定制(customize)->附加项和宏文件?Add-ins and Macro Files?页”,选中“MATLAB Add-in”。这样,在VC++工具栏出现MATLAB Add-in图标,在VC++新建工程对话框中会出现“MATLAB Project Wizard”。至此连接工作完成。

・打开VC++,在新建工程中选择“MATLAB Project Wizard”,按照提示,选择“Shalled M-dll”,输入M文件位置,VC++开始转换。如果M文件没有错误,在工程文件夹中会生成一系列.C文件。其中与M文件同名的.C文件即为转换的C代码。

第三步,编译DLL文件(强烈建议不要对刚刚生成的C代码作任何修改)。选择“编译”菜单,构建.DLL文件,在文件夹中会生成与工程名相同的DLL文件。

第四步,在VB中调用DLL文件。在第二步生成的C代码中找到所要的接口函数,注意大小写,记下函数名。在VB中使用Declare语句声明这个函数。在窗体的“通用-声明”输入如下语法:

Declare Function /Sub <函

数名> Lib “”Alias “<函数名>” ?<参数表>? as (具体语法可参看VB使用手册)。

在程序代码中直接调用声明的函数即可。需要注意的是函数调用过程中的参数传递问题。由于VB和C的数据类型以及参数传递形式不太一样,传递不当,可能会造成调试困难。特别是MATLAB中用到的大量矩阵(数组)参数,调用需十分当心。本文在下面例子中采用文件方式传递参数,利用VB和MATLAB的文件读写功能传递数组参数,对于实时性要求不高的应用,可以方便稳妥地实现数据传递。

2 应用举例

在VB中利用随机数生成16个10以内的整数,作为一个信号序列,利用MATLAB的快速傅立叶变换函数(FFT)对序列进行变换,再将变换结果传递回VB,并显示在窗体上。

在MATLAB中编辑好M文件(test.m),实现读取序列文件及FFT并写回序列文件,调试成功。代码如下:

function t

fid=fopen?'t.txt'?'rt+'?? %以读写文本方式打开

文件

?a?count?=fscanf?fid?'%d'?? %文件以整数格式读入

矩阵a

m=fft?a?count?? %FFT运算

frewind?fid?? %文件指针指向文件头

fprintf?fid?'%f'?m?? %向文件写入矩阵m

fclose?fid??

按照前述步骤在VC++中转换为test.c文件,找到接口函数,本例为mlfTest()。

void mlfTest(void){? ?

mlfEnterNewContext(0,0);??

Mtest;

mlfRestorePreviousContext(0,0);?

}

编译生成test.dll文件。

在VB中生成随机序列并写入文件:

Private Sub Command1_Click()

Randomize

Dim i As Integer

Dim a As Integer

Dim b As String

Text1.Text = ″″

Open App.Path & ″ .txt ″ For Output As #1

For i = 1 To 16

a = Int(10 * Rnd)

Print #1, LTrim(a)

b = b & Str(a) & Chr(13) & Chr(10)

Next i

Text1.Text = b

Close #1

End Sub

声明mlfTest()函数:

Private Declare Sub mlfTest Lib ″G? estdlldll.dll″ ??

调用该函数的事件代码:

Private Sub Command2_Click()

MlfTest '调用函数

End Sub

本例中未向函数传递参数,也无需函数返回运算结果,故采用调用子程序过程(Sub)方式直接调用。结果由VB读取文件获得:

Private Sub Command3_Click()

Dim str1 As String

Dim str2 As String

Text2.Text =

″″

Open App.Path & ″ .txt″ For Input As #1

Do While Not EOF?1?

Line Input #1? str1

str2 = str2 & str1 & Chr(13) & Chr(10)

Loop

Text2.Text = str2

Close #1

End Sub

编程语言matlab 篇3

关键词:线性规划;Matlab语言;linprog函数;优化配置

中图分类号:TP311文献标识码:A文章编号:1009-3044(2007)16-31076-02

A Optimal Deployment Research for Publishing Resources Based on Matlab Language

REN Ming,LI Shou-ying

(Luoyang Science and Engineering College, Luoyang 471003, China)

Abstract:This article makes a concise introduction on Matlab software,and Optimal deployment of publishers' resources is programmed by using the linprog function in matlab toolbox. This method is in common use and effictive, it is simple and quick to analysze and calculate the result about Optimal deployment of publishers' resources. For the leaders of publishing house make righe decisions,it provides a feasible and effictive method.

Key words:linear program; Matlab language; linprog function; Optimal deployment

1 引言

出版社资源主要包括人力、生产、资金和管理资源等,它们都捆绑在书号上,经各个部门的运作,形成成本和利润。资源配置是总出版社每年进行的重要决策,直接关系到它的经济效益和长远发展战略。在市场信息不完全和收集积累数据不足的条件下,总出版社领导将怎样针对分社提交的生产计划申请、人力资源情况及市场信息分析,提出以量化分析为基础的资源(书号)配置方案,使出版的书产生最好的经济效益呢?这种决策问题通常称为最优化问题,解决的常用方法是建立规划模型并求解。但是将实际问题转化成规划问题后,模型求解的过程中往往因目标函数或约束条件太复杂而大大增加计算量,使手工计算的现实性越来越小。“工欲善其事,必先利其器”,若用Matlab语言来求解最优化问题,就可以避免遇到计算量过大和编程繁琐等难题,并能够简便快速分析与计算出资源优化配置的结果。

2 Matlab软件简介

Matlab是MathWorks公司推出的一套高性能的数值计算和图形可视化软件包,利用matlab优化工具箱求解最优化问题具有编程简单、精度高、速度快、适用范围广等优点。

Matlab语言中,linprog是用于求解有约束线性规划的优化函数,在使用时需要建立目标函数和调用函数linprog的.m文件,输入初始点x0、线性不等式约束条件的系数矩阵A和常数向量b、线性等式约束条件的系数矩阵Aeq和常数向量beq、设计变量x的下界向量Lb和上界向量Ub等已知参数。程序运行后输出参数有:目标函数的最优解x点及其函数值。另外,还可以返回优化算法信息的数据结构、目标函数在最优点的梯度grad和hessian矩阵值等信息。

除此之外,Matlab还包括无约束线性函数极小化、方程求解、非线性曲线拟合等优化函数,利用这些函数求解时,基本上采用一种 “工程化方法”,即根据不同情况采用不同的算法策略,包括了最速下降法、单纯形法、拟Newton法、BFGS法和SQP等多种算法。

3 出版社资源优化配置模型的建立

题目参见有关资料(2006年全国大学生数学建模竞赛A题),此处不再重复。题目中给出A出版社(代码:P115)根据现有的信息和数据实现2006年对9个分社(计算机、经管类等)的资源(书号)优化配置。

3.1 目标函数的确定

根据题意可知:2006年的经济效益值由9个分社的总效益值累加求得,即:,其中:Si(ai)表示第i个出版社在分得书号数ai时能创造出的经济价值,且:

ai:第i个分社的总书号数目;aij:第i个分社第j门课程的书号数目;wij:第i个学科第j门课程的书号数比例;cijn:第i类学科第j 门课程在 n年时的1个书号对应的销售量;pij:第i学科第j门课程书的价格。

3.2 约束条件的挖掘

下面我们来分析挖掘题目中的一些隐含约束条件:

(1)根据01-05每年分配的书号总数都是500个,得06年书号总数量一定:

(2)A出版社为了保持工作连续性和对各分社的计划在一定程度上的认可,保证至少分给各分社申请书号数量的一半:ai≥0.5×Li,(i=1,2,…,9),其中,Li为题目提供的2006年各分社申请的书号数目,见表1:

表1 06年各分社申请的书号数目

(3)根据增加强势产品支持力度的分配原则,保证强势产品的支持力度,对各分社的书号数ai界定范围(见表2):

表2 各分社书号数的界定范围

(4)由于人力资源的限制,各分社分得的书号数必须小于等于其工作承受的能力及客观要求。即:ai≤ti,(i=1,2,…,9),ai∈N,(i=1,2,…,9)

4 用Matlab语言实现出版社的资源优化配置

根据上面2所述,我们得到一个单目标的整数线性规划模型,对于此类模型,我们可以利用MATLAB自带的优化工具箱进行求解,程序实现如下:

4.1 数据输入

在Matlab程序编辑窗口Command window中输入已知数据,包括各课程的均价、书号个数百分比、单位书号对应销售量等。

jsj=[25.8 25.5 28.0 26.0 24.7 25.6 27.0 22.9 25.9 24.5];%计算机类课程的均价

jg=[26.4 27.3 24.9 27.5 23.5 23.5 25.7 32.9 31.5 35.3]; %经管类课程的均价

sx=[21.0 20.2 24.8 19.6 18.6 23.3 13.1 18.4 22.5 25.7]; %数学类课程的均价

yy=[34.4 18.7 33.0 20.6 27.9 21.4 11.4 31.3 23.5 32.3]; %英语类课程的均价

lk=[14.7 18.8 26.6 16.7 13.4 14.8 17.5 24.2]; %两课类课程的均价

jn=[22.5 32.3 20.8 21.6 23.0 35.4]; %机能类课程的均价

hg=[20.0 23.6 25.6 28.0 18.9 26.7]; %化工类课程的均价

dl=[21.5 32.4 24.0 23.8 18.2 22.7]; %地理类课程的均价

hj=[37.5 22.2 20.7 22.7 24.3 32.2]; %环境类课程的均价

w1=[0.159090909 0.161931818 0.039772727 0.048295455 0.048295455 0.153409091 0.122159091 0.048295455 0.147727273 0.071022727]; %计算机类课程的书号个数百分比

w2=[0.135678392 0.08040201 0.090452261 0.070351759 0.090452261 0.090452261 0.095477387 0.16080402 0.095477387 0.090452261];

w3=[0.044354839 0.173387097 0.239247312 0.036290323 0.120967742 0.143817204 0.059139785 0.024193548 0.102150538 0.056451613];

w4=[0.355971897 0.044496487 0.016393443 0.18969555 0.06088993 0.121779859 0.049180328 0.044496487 0.072599532 0.044496487];

w5=[0.065789474 0.149122807 0.105263158 0.157894737 0.074561404 0.140350877 0.157894737 0.149122807];

w6=[0.296482412 0.060301508 0.110552764 0.27638191 0.100502513 0.155778894];

w7=[0.076190476 0.152380952 0.2 0.123809524 0.123809524 0.323809524];

w8=[0.175 0.183333333 0.191666667 0.216666667 0.116666667 0.116666667];

w9=[0.174603175 0.238095238 0.222222222 0.214285714 0.087301587 0.063492063];

c1=[249.4166666 363.8375 118.3333333 238.4375 162.4166667 276.5818181 503.5486111 83.08333333 387.975 414.9375]; %计算机类课程单位书号对应销售量

c2=[1425.5 1875.75 386.6666666 1106.208333 286.4166667 544.9166667 812.9375 575.2916666 2589.9375 1356.0625];

c3=[746.5416667 847.3785714 8609.903374 1297.5 1462.357843 2617.573864 628.4214286 498.8125 465.6760417 2863.553572];

c4=[747.8024039 525.45 907.9166667 268.5805555 447.8583334 274.1125 59.91666667 632.3875 347.4464286 301.8333333];

c5=[5297.5625 7532.660714 8622.2 4606.104167 16071.85416 7891.25 4104.633929 1241.875];

c6=[681.3461539 266.875 480.25 816.175 1204.683334 1000.75];

c7=[1038.75 863.95 406.975 162.9166667 782.0833333 427.4583333];

c8=[226.6666667 644.875 600.125 810.5 295.1666667 1543.666666];

c9=[593.1875 476.7916667 629.1666666 414.25 718.625 1460.75];

4.2 调用Matlab中的优化函数linprog求解

在Matlab程序编辑窗口Command window中调用优化函数linprog函数,程序实现如下:

y=[sum(jsj.*w1.*c1) sum(jg.*w2.*c2) sum(sx.*w3.*c3) sum(yy.*w4.*c4) sum(lk.*w5.*c5) sum(jn.*w6.*c6) sum(hg.*w7.*c7) sum(dl.*w8.*c8) sum(hj.*w9.*c9)];

Aeq=[1 1 1 1 1 1 1 1 1];beq=500;% 线性等式约束条件的系数矩阵Aeq和常数向量beq

A=[];b=[];%线性不等式约束条件的系数矩阵A和常数向量b

vlb=[70 35 145 78 40 38 17 21 21];vub=[78 44 155 90 50 42 25 27 27];

j=[64 69 77 6973

3739433941

147 148 153 150 146

9587778385

4448425044

4042403839

2425201719

2221232727

2721252726];

qn=y*j; %01-05年的经济总值

[x,fval]=linprog(y,A,b,Aeq,beq,vlb,vub)%x 为06年书号分配方案,fval为06年经济总值

4.3 运行结果

将上述程序运行,结果得到出版社资源的最优配置方案如表3、表4。

表3 2006年A出版社资源最优配置方案

表4 01-06年的经济效益值

5 结束语

通过Matlab实现对有约束线性规划模型的求解,可在较为复杂的目标函数和约束条件下简便快速地分析与计算出资源优化配置的结果,为出版社领导作出正确的决策提供了切实有效的方法,具有良好的通用性、有效性和简便性,可应用于各种资源配置问题或最优化问题的研究,同时也为数学建模竞赛中大型规划模型求解提供了快速有效的方法。

参考文献:

[1] 韩中庚,等著. 数学建模方法及其应用[M]. 北京:高等教育出版社, 2005.

[2] 姜启源 著. 数学模基型[M]. 北京:高等教育出版社,2003.

[3] 王学辉, 张明辉 著. MATLAB6.1[M]. 中国水利水电出版社,2002.

[4] 楼顺天, 于卫, 阎华梁 著. MATLAB程序设计语言[M]. 西安电子科技大学出版社,1997

[5] 沈树德. 图书出版成本核算管理中的预测与决策[J]. 出版探讨,2004,4:2-4.

编程语言matlab 篇4

(1) MATLAB程序不能脱离其运行环境,可移植性差;

(2) MATLAB是一种解释性语言,语言执行效率低,实时性较差;

(3) MATLAB的界面开发能力较差,难以开发出友好的应用界面;

(4) MATLAB编写的M文件是文本文件,容易被直接读取,难以保护劳动者的成果。VC++用于面向对象的可视化编程,可以完成从底层软件直到面向用户软件等各种应用程序的开发。利用它提供的各种实用工具,开发者可以轻松开发出高效强大的Windows应用程序。但在实际工程开发中,与MATLAB相比:

(a) VC++在数值处理分析和算法工具等方面不如MATLAB;

(b) VC++在准确方便地绘制数据图形(数据可视化)方面不如MATLAB。

因此,把MATLAB在数值计算、算法设计以及数据可视化等领域的优势与VC++应用系统集成,不仅可以完全满足系统在数据运算与表现方面的需求,而且还可提高系统处理的效率和稳定性,同时也减少了开发人员实现算法的困难,缩短了软件开发的周期,提高了软件质量,在实践中具有很高的使用价值。

1在VC环境中调用Matlab程序主要有以下几种方法

1.1通过Matlab Engine方式

Matlab Engine是指一组Matlab提供的接口函数, 支持C语言, Matlab Engine采用C/S (客户机/服务器) 模式, Matlab作为后台服务器, 而C程序作为前台客户机, 通过Windows的动态控件与服务器通信, 向Matlab Engine传递命令和数据信息, 从Matlab Engine接受数据信息。用户可以在前台应用程序中调用这些接口函数, 实现对Matlab Engine的控制。采用这种方法几乎能利用Matlab全部功能,但是需要在机器上安装Matlab软件,而且执行效率低,因此在实际应用中不采用这种方法,在软件开发中也不可行。

1.2直接调用Matlab的C/C++数学函数库

Matlab中提供了可以供C/C++语言调用的C/C++数学函数库,其中包含了大量用CC++语言重新编写的Matlab数学函数,这些函数涉及到线形代数、数值分析、傅立叶变换、多项式计算、解微分方程等,并且函数库中提供了大量各种矩阵操作函数,在VC中可以直接使用这些函数,通过这些函数可以在VC中方便的实现在Matlab中矩阵运算功能。可以看出用这种方法可以很灵活的调用Matlab来编写应用程序,但要求读者对CC++语言比较熟悉,可以看出使用这种方法调用Matlab的工具箱函数有很大困难。适合对CC++语言比较熟悉的用户使用。

1.3用Matlab自带的Matlab Compiler

Matlab Compiler的作用是将m文件转化成C/C++代码(也就是通常所用的mcc命令), 这种源代码需要用C/C++编译器编译连接成独立应用程序,在将m文件转成独立应用程序的过程中生成的C/C++文件,原则上是可以被其它的C/C++代码调用的,编译器可以通过设置mcc命令的选项,将m文件编译成动态链接库文件、C/C++文件、可执行文件等一系列文件。到matlab R21.1为止,Matlab Compiler的m程序转换成C/C++代码功能有很多限制:

1.不能转换脚本m文件,只能转换m函数;

2.不能使用matlab对象;

3.不能用input或者eval操作matlab空间变量;

4.不能动态地命名变量,然后用load或者save命令来操作;

5.不能处理具有嵌套调用其他m文件的m文件;

6.不能使用MATLAB内联函数;

1.4使用matlab的combuilde工具

COM是component object module的简称,它是一种通用的对象接口,任何语言只要按照这种接口标准,就可以实现调用它。matlab6.5新推出来的combuilder就是把用matlab编写的程序做成com组件,供其他语言调用。该方法实现简单,通用性强,而且几乎可以使用Matlab的任何函数 (注意:不支持脚本文件,脚本文件使用时要改为函数文件) ,因此在程序较大、调用工具箱函数或调用函数较多时推荐使用,这也是Matlab公司 (Matlab公司就是Mathworks公司) 推荐的使用方法。

1.5使用matcom工具。

这是个第三方控件,很小 (8M多) , 原本属于mathtool公司,后来被Mathworks公司合并了,使用该工具可以将m脚本文件和m函数转化成相同功能的CC++文件,相比其它方法使用matcom具有如下优点:

1.转换过程简单 (由matcom工具自动实现) ,容易实现;

2.可以方便的生成动态链接库文件 (dll) 和可执行文件 (exe) ;

3.不仅可以转换独立的脚本文件,也可以转换嵌套脚本文件;

4.设置环境后,可以使用Matlab的工具箱函数。

但matcom也有以下不足:

1.待编译的M文件不能涉及MATLAB的内部类;

2.部分绘图语句无法实现或得不到准确图象,尤其是三维图象。

因此在不涉及到三维做图以及m文件不大的情况下推荐使用。

综合考虑上述几种结合方式,MATCOM转化法最为简便有效,笔者认为是实现VC++与MATLAB联合编程的最佳途径。

2实现VC与matcom的接口步骤

首先安装matcom,然后运行Visual C++6.0,从菜单条中选择Tools/Customize/Add-ins and Macro Files,在出现的对话框中选中Visual Matcom Add-in,关闭对话框,这时在Visual C++[1]的开发环境中看到一个Visual Matcom工具栏,表明安装成功。

3应用举例

下面以一个线性方程组的求解过程为例,介绍通过matcom实现VC对Matlab程序的调用,运行环境:Windows XP、Matlab6.1、Matcom4.5、Visual C++6.0

X1+2X2+3X3=4

2X1+X2+2X3=-4

X1+3X2+3X3=8

Matlab运行环境中编写程序equation.m,其代码如下:

这里以一个简单的控制台程序为例,其它程序基本相同。在VC环境中建立一个名为Test的Win32 Console Application工程。

点击Visual matcom工具栏上的m++图标,选择保存过的Matlab文件equation.m进行转化。如果看到的转化信息提示没有错误就可以观察到此时在File View标签中多了m-files, C++files created from m-files, Matrix等文件。并且该工程目录下增加了equation.h, equation.cpp, equation.mak, equation.r等的4个文件。这时会在VC中出现一个转换完毕的文件,文件中如果报告有错误就要考虑是否程序有问题,可以双击C++files文件夹下的equation.m进行修改,再重新转化直到没有错误报告为止。

在Test工程下建立一个文件test.cpp调用转化的Matlab函数,代码为:

注意:程序中涉及到了两个成员函数.rows () 和.cols () ,它们分别返回矩阵的行数和列数;x.r (i, j) 代表矩阵x的第i行第j列的元素。

编译运行后结果为x (1, 1) =-4.000000 x (2, 1) =4.000000 x (3, 1) =0.000000与实际结果一致。

总结:如果需要转换的.m文件不是一个函数,只是一些Matlab命令的集合,则要在工程目录下找到转换文件的.cpp文件,将其中的C代码拷贝到需要调用它的函数里面。Matcom克服了mcc命令只能编译一个独立.m文件的缺点,当所编译的.m文件依赖于其他.m文件时,只要把被调用的.m文件与要编译的.m文件放在同一目录下,生成的被调用文件的.h和.cpp文件插入到VC开发的工程中就可以了。

上面只是一个简单的控制台工程的例子,我们也可以建立其它类型的工程,只要在需要调用转换后函数的程序中包含matlib.h并且在响应函数中初始化matlib库initM (MATCOM_VERSION) ;结束调用后做结束工作exitM () ;就可以了。

本文讨论了VC与Matlab的联合编程,主要集中讨论在VC中调用Matlab的实现方案。通过一个matcom编译实现的例子我们看到,利用Visual matcom转换代码非常方便,生成的代码可读性好,而且还支持多数图形函数,基本上使Matlab和VC能够得到充分的发挥。作者在图形处理中使用这种方法来提高程序的执行速度,取得了非常理想的效果。它不仅解决了Matlab的解释执行方式带来的执行速度过慢的缺陷,更重要的是它完全脱离了Matlab系统,当代码被编译成可执行程序后,又可大大提高程序的安全性。

摘要:本文在分析Visual C++和Matlab各自特点的基础上, 提出了几种联合编程的方案, 然后对各种方案进行比较分析。最后结合实例重点介绍了其中简便实用的Matcom联合编程方案, 该方案不仅能转化成C/C++函数, 而且可以支持图形函数功能, 还可以为科学研究和工程技术提供更强的技术支持。

关键词:Matlab,Visual C++,Matcom,联合编程

参考文献

[1]张志涌等.精通MATLAB6.5版[M].北京:北京航空航天大学出版社, 2003.

[2]阮沈勇等.MATLAB程序设计[M].北京:电子工业出版社, 2004.

编程语言matlab 篇5

基于Matlab语言的杂交水稻品种的颜色特征

本研究组建了基于机器视觉的`杂交水稻种子检测硬件软件系统,并利用Matlab 语言平台提取了杂交水稻种子图像的R、G、B、H、S、V六个颜色特征参数,研究了六个参数与水稻的品种相关性,实验证明通过颜色识别杂交水稻品种具有可行性,此结果为杂交水稻种子的基于机器视觉的识别方法提供了参考价值.

作 者:周超 欧阳爱国 吴继华 刘燕德 ZHOU Chao OUYANG Aiguo WU Ji-hua LIU Yan-de 作者单位:江西农业大学,江西,南昌,330045刊 名:生物数学学报 ISTIC PKU英文刊名:JOURNAL OF BIOMATHEMATICS年,卷(期):21(4)分类号:Q-332关键词:颜色 杂交水稻种子 机器视觉 品种相关性 MATLAB6.5

编程语言matlab 篇6

1.1 多项式表示

Matlab采用行向量的形式表示多项式,将多项式的系数按照降幂次序放在行向量中。对于多项式P(x)=a0xn+a1xn-1+…+an-1x+an,其系数行向量为P(x)=[a0a1…an-1an]。比如多项式x4+3x3+4x+5的系数向量可以用[1 3 0 4 5]表示,注意顺序必须是从高次幂到低次幂,多项式中缺少的幂次用0补齐。

下面的代码设计一个函数ploy2str,实现把一个行向量表示的多项式转换成常规字符串表示的多项式:

下面的代码设计一个函数str2poly,实现把多项式字符串转换成多项式的行向量表示,要求不必降幂排列,并且函数具有实现多项式同类合并功能:

1.2 多项式求值

Matlab调用polyval函数计算多项式的值。调用方式如下:y=polyval(p,x)。其中:p为行向量形式的多项式,x为代入多项式的值,它可以是标量、向量或矩阵。如果x是向量或矩阵,则该函数将对向量或矩阵的每一个元素计算多项式的值,并返回给y。

Matlab不但可以计算矩阵元素的多项式值,也可以把整个矩阵代入多项式作为自变量进行计算。计算矩阵多项式的值的函数是polyvalm,调用方式为:Y=polyvalm(p,X)。即把矩阵X代入多项式p中计算,其中矩阵X必须是方阵。

下面的代码用于求多项式的值和矩阵多项式的值:

1.3 多项式乘法和除法

多项式乘法和除法也就是多项式向量的卷积和解卷积运算,Matlab使用conv和deconv来实现这些功能。调用格式如下:

下面的代码实现多项式x2+2x+3与2x2+3x+4多项式的乘积:

下面的代码实现多项式2x4+7x3+16x2+17x+12除以多项式x2+2x+3:

1.4 多项式导数

Matlab使用polyder函数计算多项式的导数。调用方式如下:

下面的代码实现多项式的求导:

1.5 多项式积分

Matlab使用polyint函数计算多项式的积分。调用格式如下:

下面的代码求多项式的积分:

1.6 多项式的根

Matlab使用函数roots求多项式的所有根,调用方式为r=roots(p)。其中:p为多项式,r是所有根组成的向量,其长度等于根的个数。

下面的代码求多项式2x3-2x2-8x+8的根:

多项式求根的逆过程是由根创建多项式,它由函数poly实现。调用格式如下:

下面的代码由根[-2 2 1]创建多项式:

下面的代码求矩阵的特征多项式:

1.7 多项式展开式

Matlab使用函数residue将多项式比值用部分分式展开,也可以将一个部分分式表示为多项式的比值。调用格式如下:

(1)[r,p,k]=residue(b,a)将多项式比值b/a的部分分式展开,返回值r是部分分式的留数,p是部分分式的极点,k是直接项。如果多项式a没有重根,则部分分式的形式如下:

(2)[b,a]=residue(r,p,k)从部分分式得到多项式向量

下面的代码将多项式比值的部分分式展开,然后再把部分分式表示为多项式的比值形式:

1.8 多项式曲线拟合

曲线polyfit采用最小二乘法对给定数据进行多项式拟合,最后给出多项式的系数。调用方式为:p=polyfit(x,y,n),采用n次多项式p来拟合数据x,y,从而使得p(x)与y的均方差最小。

下面的代码调用polyfit研究不同多项式阶数对拟合结果的影响:

执行该代码得到图1的结果。可以看出:使用5次多项式拟合时,效果比较差。而使用8次多项式拟合时,得到的结果与原始数据很接近。但使用60次多项式拟合时,效果非常差。因此使用多项式拟合时需要选择适中的阶数,而不是阶数越高精度越高。

2 插值运算

插值是在已知数据之间寻找估值的过程。在拟合系统和图像处理中,插值是常用的功能。Matlab提供很多函数用于插值运算。

2.1 一维插值

一维插值就是对一维函数f=f(x)进行插值,分为基于多项式的插值和基于快速傅里叶的插值两种。

(1)多项式插值:通过函数interp1实现。调用格式如下:

当选择一个插值方法时应该考虑方法的执行速度、占用内存大小和获得数据的平滑度一维插值可以指定的方法如下:

下面的代码采用不同的插值方法对一维数据进行插值,并比较其不同:

执行上述代码可得到图2所示的结果。

(2)一维快速傅里叶插值:通过函数interpft来实现。该函数用傅里叶变换把输入数据变换到频域,然后用更多的点的傅里叶逆变换变换到时域,其结果是对数据进行增采样。其调用格式如下:

下面的代码利用一维快速傅里叶插值实现数据增采样:

执行上述代码,可得到图3所示的结果。

2.2 二维插值

二维插值主要应用于图像处理和数据可视化,其基本思想与一维插值相同。通过对二维函数z=f(x,y)进行插值。Matlab提供的二维插值函数为interp2,调用格式如下:

二维插值可以指定的方法如下:

下面的代码采用二次插值对三维高斯分布函数进行插值:

编程语言matlab 篇7

福建省自然科学基金项目(Z0512003)资助MATLAB是由Mathwork公司推出的一种高性能的数值计算和可视化软件。它的编程比较简单,有强大的矩阵运算及图形显示能力,还有多样化的各种工具箱可供使用,在数值分析、信号处理、系统辨识、特殊函数和图形等方面具有广泛的应用。不过,由于MATLAB是一种解释性语言,执行效率比较低,而且它并不适用于通用的编程平台,这就大大限制了它的应用场合。

JAVA是由Sun公司开发的一种面向对象的程序设计语言。它具有简单、跨平台、分布式、解释性、可靠、安全、结构中立性、可移植性、高性能、线程等优点,已被广泛应用于开发各种商业软件。但是,JAVA对某些比较复杂的数学运算的编程比较繁琐,处理速度也较慢 。

因此,如果能在JAVA程序中调用MATLAB程序来处理一些比较复杂的数学运算,充分发挥MATLAB强大的数学运算能力和仿真功能,就能弥补单独编程的缺点,提高编程效率和加快处理速度。

1 通过JNI技术调用MATLAB Engine函数

通过JAVA的JNI技术调用MATLAB向C/C++语言提供的MATLAB Engine函数,能实现JAVA程序对MATLAB程序的调用。

1.1 JNI技术

JAVA的JNI技术[1]是JAVA Native Interface的简称,意思是本地编程接口。 Java语言是一种功能很强的编程语言,应用程序如果能全部用JAVA语言来编程固然很好。但在实际的编程过程中,如果已经有了大量测试过和调试过的其它语言的代码,将这些代码移植成JAVA语言很费时间,而且产生的代码还需要再次测试和调试。这时候如果能在JAVA中使用其他语言将会减少开发的时间。JAVA语言提供的JNI技术,使得JAVA程序代码能够调用使用其他编程语言(如C++)编程的有关知识。JNI最重要的好处是它没有对底层JAVA虚拟机的实现施加任何限制。因此,JAVA虚拟机的厂商可以在不影响虚拟机其他部分的情况下添加对JNI的支持。程序员只需编写一种版本的本地应用程序获库,就能够与所有支持JNI的JAVA虚拟机一起工作。

1.2 MATLAB Engine函数

MATLAB Engine函数[2]是指一组MATLAB提供的面向C/C++和Fortran等语言的接口函数,用户可以通过在其它编程环境中调用这些接口函数,实现对MATLAB的控制。通过MATLAB Engine ,应用程序会打开一个新的MATLAB进程,可以控制它完成任何计算和绘图操作。同时,MATLAB Engine方式打开的MATLAB进程会在任务栏显示自己的图标,打开该窗口,可以观察主程序通过engine方式控制MATLAB运行的流程,并可在其中输入任何MATLAB命令。

常见的MATLAB Engine函数有:

engOpen:开启Matlab Engine。

engClose:关闭Matlab Engine。

engGetVariable:从Matlab Engine中获得一个Matlab矩阵,用于数据交换。

engEvalString:执行一个Matlab命令。

engPutVariable:从应用程序向Matlab Engine发送一个Matlab矩阵,用于数据交换。

engOutputBuffer:创建字符缓冲区以获取Matlab文本输出。

1.3 JNI技术调用MATLAB Engine函数的基本步骤

1)编写JMatLink.java,将所有要调用到的MATLAB Engine函数定义成native。

2)在JMatLink.java中加入static的System.loadLibrary("JMatLink")。

3)使用javac编译JMatLink.java生成JMatLink.class。

4)使用javah-jni JMatLink.class 来生成JMatLink.h。

5)在VC中创建动态链接库工程JMatLink.dll,将JMatLink.h文件加入工程中。

6)编写实现JMatLink.h文件对应的JMatLink.cpp文件。

7)编译JMatLink.dll文件,将JMatLink.dll文件放到JMatLink.java的目录中。

要在VC中成功编译JMatLink.dll,必须在JMatLink.cpp包含MATLAB Engine头文件engine.h并引入MATLAB对应的库文件libmx.lib、libmat.lib、libeng.lib、libmatlb.lib。具体的设置如下:

1)通过菜单工具→选项,进入目录页面,在目录下拉列表框中选择Include files,添加路径:"C: MATLABextern include"(假定MATLAB安装在C: MATLAB目录)。

2)选择Library files,添加路径:C: MATLAB extern lib win32 microsoft msvc60。

3)通过菜单工程→设置,进入连接页面,在对象/库模块编辑框中,添加文件名libmx.lib libmat.lib libeng.lib libmatlb.lib。

2 混合编程在量子密码通信中的应用

加密是保障信息安全的重要手段之一。当前最常用的加密技术是用复杂的数学算法来改变原始信息。这种方法虽然安全性较高,但存在被破译的可能,并非绝对可靠。而量子密码是一种截然不同的加密方法,主要利用量子状态作为信息加密和解密的密钥。任何想测算和破译密钥的人,都会因改变量子状态而得到无意义的信息,而信息合法接收者也可以从量子态的改变而知道密钥曾被截获过。从理论上来说,用量子密码加密的通信不可能被窃听,安全程度极高。1984年,Bennett和Brassard在研究中发现,单量子态虽然不好保存但可用于传输信息,两人共同提出第一个量子密码分配协议BB84协议[3]。

丹麦Aarhus大学用JAVA语言编写了一个模拟量子密钥分配协议的软件平台——QuCrypt,利用它在互联的计算机上实现了对BB84协议和B92协议的模拟。现在要在QuCrypt软件平台上模拟另外一种量子密钥分配协议——Reverse Reconciliation Gauss-moduled QKD协议[3]。

Reverse Reconciliation Gauss-moduled QKD协议(简称RR协议)[4]是基于连续变量的一种量子密钥分配协议。在QuCrypt平台上模拟RR协议共分为三步:首先,由发送方通过QuCrypt软件的量子信道发送连续调制相位和幅度的相干光脉冲来获得具有高斯分布的密钥信息,同时接收方进行零差拍的探测。然后,通信双方执行样条纠错算法(slice算法)将连续变量的密钥转换成离散的二进制密钥。最后,双方再通过QuCrypt软件的公共信道进行比较,得到最终密钥。在这个过程中,第二步的slice算法是用MATLAB语言编写的,而通信平台是JAVA语言编写的。因此,这就要求在JAVA的程序中实现对MATLAB程序的调用。

2.1 Slice算法的MATLAB程序

slice算法是实现将连续的高斯变量离散化的算法。假设发送方拥有一连串的高斯变量X(1…n), 接收方也拥有X′(1…n),由于信道噪声的存在X′=X+ε, εN(0,σ)。函数S(X)可以将初始密钥转换成mbit的二进制数S1…m(X)=(S1(X),…,Sm(X))。图1表示的是m=3的情况:

P(X)是变量的概率密度分布函数,依据一定的规则划分为2m片段,在X轴上对应的区间为[Ti,Ti+1](0<≤i≤2m-1)。每一个区间对应密码本中特定的S1…m(X)。量化时首先判断变量X落在那一个区间里,然后再映射到相应的S1…m(X)。同理,接收方量化得到S1…m(X')。把S1…m(X)和S1…m(X')又称为“Slice(片段)”。

MATLAB源代码的核心部分及其说明如下:

%t是总的量化区间

t=[-10,-2.347,-1.808,-1.411,-1.081,-0.768,-0.514,-0.254,0,0.254,0.514,0.768,1.081,1.411,1.808,2.347,10.0];

%共有5000个随机数

numall=5000;

variance1=1;

%打开保存随机数的文件

fid=fopen('ziggurat.txt','r')

randn=fscanf(fid,'%f');

fclose(fid);

for i=1:numall;

%x是发送方送出的数

rawx(i)=variance1.*randn(i);

end

%goodkey保存了发送方和接收方采用相同基的位

fid3=fopen('goodkey.txt','r')

pos=fscanf(fid3,'%c')

fclose(fid3);

goodkey=1;

for i=1:numall;

%如果采用相同基,则保留该随机数

if( pos(i)==′1′)

x(goodkey)=rawx(i);

y(goodkey)=rawy(i);

goodkey=goodkey+1;

else goodkey=goodkey;

end

end

goodkey=goodkey-1;

%将发送方的值量化成四位二进制数

for i=1:goodkey;

for k=1:16;

d=k-1;

if x(i)>=t(k)&x(i)<=t(k+1)

sx1(i)=mod(d,2);

sx2(i)=mod(fix(d/2),2);

sx3(i)=mod(fix(fix(d/2)/2),2);

sx4(i)=mod(fix(fix(fix(d/2)/2)/2),2);

break;

end

end

end

2.2 JAVA程序的实现

为了在QuCrypt软件平台上调用MATLAB Engine函数,首先,把JMatLink.java,JMatLink.class和 JMatlink.dll加到QuCrypt软件的程序里面。然后,用JAVA编写一个界面程序Jmatlabtest.java也加入到程序里面,JMatLink.java的功能是建立一些按钮,只要按下这些按钮,就可以调用由MATLAB编写的slice算法。它运行后的界面如图2所示,其中,slice1,slice2,slice3,slice4就是slice算法。

Jmatlabtest.java中先要在程序的开头新建MATLAB Engine函数的对象:

JMatLink eng=new JMatLink();

Jmatlabtest.java中实现按钮功能方法的核心代码如下:

class Btn1 implements ActionListener {

public void actionPerformed(ActionEvent e)

{

eng.engOpen();//打开MATLAB Engine函数

eng.engEvalString(……);//执行括号里面的程序

eng.engClose(); //关闭MATLAB Engine函数

}

}

eng.engEvalString(……)的括号里面是经过修改过的实现slice算法的MATLAB代码。这些代码是先将原来的MATLAB代码整个拷贝过来,然后修改代码中一些在MATLAB环境下和JAVA环境下不同的符号。比如,在WINDOWS中,MATLAB程序的路径分隔符号是“”,而JAVA程序的路径分隔符号则是“/”。又比如,MATLAB程序的注释符号是“%”,而JAVA程序的注释符号是“//”。图2中的转化代码按钮就是实现这些功能的。

按下图2中“执行slice1”按钮后,就会跳出一个MATLAB命令窗口。在命令窗口中可以输入MATLAB命令来观察程序运行的状况。比如,在命令窗口中输入workspace后可以跳出MATLAB工作区间,在工作区间中就能对程序中的一些变量进行操作处理了。

3 小结

通过MATLAB Engine函数来实现JAVA程序对MATLAB程序调用的方法和应用,要利用VC作为中介,建立一个JAVA和MATLAB Engine函数相关联的JMatLink库。因此,在处理数据量非常大的程序中,这种方法会比较慢。但是,这种方法只需要建立一次JMatLink库,以后只要根据需要增加JMatLink库里面的MATLAB Engine函数。而且,在JAVA程序调用MATLAB程序的过程中对原来的MATLAB代码改动较少,这就能够充分利用好很多现有的MATLAB代码。使用JAVA和MATLAB进行混合编程可以提高程序处理速度和简化程序处理过程,在需要复杂的数学运算与数学仿真的领域,必将会得到越来越多的应用。

摘要:JAVA和MATLAB的编程有各自的优缺点。将它们结合起来进行混合编程能够充分发挥它们各自的优点,弥补单独编程的不足之处。本文介绍了通过JNI技术实现JAVA对MATLAB调用的方法,并说明了其在量子密码通信中的一个应用。

关键词:JAVA,MATLAB,量子密码,混合编程

参考文献

[1]Cay S,Cornell.Gary JAVA2核心技术卷2第7版.陈昊鹏,王浩,姚建平,等译.北京:机械工业出版社,2006:717—759

[2]余啸海.Matlab接口技术与应用.北京:国防工业出版社,2004

[3]Bennett C H,Brassard G.Quantum cryptography:pablie key distribu-tion and coin tossing.In:Proceedings of IEEE International Conference on Computers,Systems and Processing.Bangalore,1984;175

编程语言matlab 篇8

1.1 矩阵函数库 MatrixVB

MatrixVB是由第三方 ( mathtools公司 ) 提供的COM组件, 包含了大量与Matlab相似的函数与调用语法, 可以加强VB的数学运算与图形展示功能[2]。这种方法的优点是使用起来简单, 在VB程序代码中可以像使用VB自己的函数一样使用MatrixVB的函数, 而且可以不依赖于Matlab的环境在Visual Basic中完成矩阵运算与图形绘制显示等功能。而其缺点是可以利用的函数有限, 需要进行比较复杂的工作时功能不够用, 在遇到这样的情况时, 要解决问题就必须使用另外的方法。

这种方法在使用前需要以下准备工作:

(1) 安装MatrixVB到系统中, 或者说将它的必要组件注册到系统中。

(2) 在VB工程中调用它的函数库, 一般是名为MMatrix.dll。

(3) 按照其使用方法 ( 可查阅说明文档 ) 编写程序代码。

做好上面所述的准备工作后, 就可以直接在VB的源程序代码中写入相关的函数代码, 从而使用MatrixVB提供的函数。在Matlab中大部分的常用函数都能够使用在VB程序中, 但是在VB下编程必须要符合VB的编程格式, 所以在使用MatrixVB提供的函数时应该先查阅说明文档, 了解其中函数使用时需要符合什么样的格式。常用的函数使用如下[4]:

其他的函数还包括有关信号处理、文件操作、最优化运算等问题的相关函数, 具体的使用方法可以参考MatrixVB的说明资料或相关教程。

调用MatrixVB注意事项:

(1) MatrixVB和VB的加、减、乘、除以及乘方运算符书写方式不同, 进行矩阵运算时需要使用MatrixVB的运算符进行运算。

(2) 在VB中定义的数组, MatrixVB会将其转换为矩阵来计算, 但MatrixVB不能反过来将矩阵降格为数组, 所以需要进行转换。一般在进行矩阵运算之前, 需要定义一些变量用于接收MatrixVB中矩阵元素的值或属性值。

1.2 动态链接库 (DLL)

这种方法要使用Matlab自带的一种功能: 将m文件编译成COM组件也就是dll文件, 从而被VB程序调用, 就可以在VB程序中运行m文件中的内容[3]。这种方法需要Matlab实时运行函数库 (MCR) 的支持, 这稍微提高了使用难度, 同时, 其功能得到很大提升, 只要是MCR库中含有的函数都能够在混合编程中使用。解决实际问题时, 只要将相应的m文件编译成dll文件并调用, 就能在VB程序上运行相应的数学运算。

编译之前需要确保系统中安装了两个编译环境, 一是MCR运行环境, 也就是Matlab本身的运行环境, 只需安装Matlab或其中的MCR即可, 注意版本不能过老, 否则会出现错误。二是C++编译器, 如C++6.0, 并在Matlab启动comtool之前将转换器设置成C++对应的complier, 使之替换掉原本的Matlab编译器[5]。

使用步骤如下:

(1) 编写正确的M文件并保存。

(2) 打开Matlab Builder for COM (7.0中为输入comtool或在菜单中打开, 往后的版本改成输入deploytool命令)。

(3) 在弹出对话框中建立工程, 选择M文件并保存, 然后编译成COM组件。

(4) 编译成功后, 在VB工程中调用相应的dll文件。

(5) 一般使用call xxx指令调用M文件中的自定义函数,注意按正确的格式输入参量。

2 使用示例

2.1 MatrixVB 方法

在使用MatrixVB时, 只需要在系统中安装软件包, 然后在VB工程中调用MMartrix函数库, 就可以在VB的编程代码中直接使用MatrixVB的函数。MatrixVB在VB程序中被调用时, 绘图和运算的结果一般会以弹出窗口的形式显示, 在基本的矩阵运算中, 运算结果以弹出窗口Matrix Viewer的形式显示出来。如图1所示, 在VB的点击按钮事件中写入A=magic (5) ;A.show;之后, 点击该按钮就会显示计算结果。

进行相应的计算之后使用A.show命令就可显示出运算结果, 如图1所示。

如果调用了作图功能的函数, 在没有特殊设置的情况下,绘图结果会以弹出figure窗口的形式显示出来。弹出的figure窗口与Matlab中的figure窗口类似, 并包含了许多原有的功能, 例如保存图像为文件等。如图3所示, 利用VB制作界面和按钮, 配合相应的作图功能的函数, 就可制作成简单的函数图形绘制程序。常见的数学函数如正弦、指数函数图形,或者是用户指定的函数形式, 都能够方便地绘制图形。

2.2 动态链接库 (dll) 方法

这种方法实际上就是将M文件编译为COM组件的方法,其最大优点就是能够通过M文件编程进行运算, 可以自由编译出自定义函数, 同时能使用Matlab运行函数库中所有的函数命令, 这样一来能够解决问题的范围就更加广泛。

上文所述的利用MatrixVB解决一般的矩阵、绘图问题,利用Matlab同样可以解决, 因此利用动态链接库方法时只需要增加一个编译成COM组件 (即dll文件) 的步骤就能够完成。这种方法还有MatrixVB所不具有的优点, 能够调用比前者更多的函数和功能。

下面通过一些简单问题来反映这种方法的优点, 例如,非线性曲线拟合这一功能是没有被包含在MatrixVB提供的函数库中的, 要解决与之相关的问题就能够使用上述的方法。利用Matlab中常用的一个求非线性最小二乘拟合的函数———lsqcurvefit , 结合M文件编译成dll的方法 , 去解决一般的非线性曲线拟合问题。

下面举一个相关问题作为例子, 用表格中给出的数据去对一个非线性函数进行曲线拟合, 如表2所示。

处理步骤如图4所示。

首先, 将处理这一问题的方法写入M文件中, 写入的代码必须符合Matlab的语法, 这里使用了lsqcurvefit这一函数,用于通过最小二乘法来解决非线性曲线拟合问题。保存好M文件之后, 按照前面所说的使用步骤, 将M文件编译成dll文件并在VB程序中调用之后, 就可以在VB程序中使用。在VB中使用的方法有很多种, 其中一种方法是制作相应的数据输入界面和显示界面, 经过适当的数据输入输出, 正确地调用M文件中编写的函数, 从而顺利地解决这一问题。

图5为用于解决上述问题的拟合结果。

这种方法的一大优点是通过M文件来自由编程, 需要利用Matlab的功能去完成的工作可以全部写入M文件中, 这使得Matlab的优势能够更大程度地发挥出来, 此方法特别适合于使用Matlab处理数学问题的工作者, 能够大大提高工作效率。

2.3 性能对比

通过分别使用上述两种方法去解决同一个问题, 来测试并对比两者在使用过程中运行时间和占用内存的多少。测试所用的问题是对一个随机生成的100阶魔方矩阵进行乘方运算, 进行运算的同时用具有计时作用的语句记录下完成这一次计算所用的时间, 以及通过Windows任务管理器来监测进行运算的VB程序占用了多少内存。为确保对比的结果准确有效, 编写程序的过程中两者程序必须保持除了计算部分之外的一致性。

测试结果如表3所示。

测试结果表明, 在处理一般的纯计算问题时MatrixVB方法在运行时间和占用内存这两个方面都比另一种方法更为良好, 同时在软件的函数库的体积上MatrixVB也更有优势, 这些优点说明MatrixVB方法更加适合大众, 适用于多数数学计算问题的解决。而将M文件编译成dll文件这种方法虽然要求更多的时间、内存和运行环境空间, 但在功能上则比MatrixVB方法更为强大, 能够处理前者难以解决的数学问题。

3 结语

利用多种语言混合编程来解决问题是一种事半功倍的有效方法, 这样的方法能够发挥不同编程语言各自的优势, 取长补短, 灵活搭配, 能够适应不同环境, 解决各种不同场合中的问题。通过文中的两种方法灵活地把Matlab和VB这两大软件连接起来, 就可以综合利用Matlab强大的计算功能和图形处理功能, 以及VB的强大的图形用户界面设计功能, 两者通过动态数据交换, 能够极大地提高工作效率, 以更为有效和易用的方法解决软件上的数学问题。介绍的两种混合编程方法各自有其优点和缺点, 实际使用时, 最为实用有效的途径就是将以上两种方法灵活运用于各种或繁或简的问题上,从而能够以更高的效率解决解决各种问题。

摘要:为了使Matlab的强大功能可以在更广泛的领域发挥,混合编程是一种颇为适宜的方法。而Microsoft Visual Basic是一款十分适合于开发友好的用户操作界面的编程语言,其编出的程序的交互性和易用性正好弥补了Matlab在设计用户操作界面上功能的不足。VB与Matlab有许多种方法可以进行混合编程,这样的方法能够发挥不同编程语言各自的优势,取长补短,灵活搭配,能够适应不同环境,解决各种问题。

编程语言matlab 篇9

Qt是一个跨平台的C++图形用户界面应用程序开发框架。它包括跨平台类库、集成开发工具和跨平台IDE[1]。由于强大的跨平台特性, 使用Qt只需一次性开发应用程序, 无须重新编写源代码, 便可跨桌面和嵌入式操作系统运行。在图形处理方面, Qt提供了用于2D绘图的QPainter绘图类和第三方绘图库Qwt, 可以绘制简单的图形, 但其过程复杂、设置繁琐, 且操作过程不易实现。

MATLAB作为一种高性能的数值计算和可视化软件, 它集数值分析、矩阵运算、信号处理和图形显示于一体, 构成了一个方便、界面友好的用户环境。相比Qt而言, MATLAB有非常强大的图形化显示矩阵和数组的能力, 用MATLAB生成的图形可轻松实现添加文字说明、标注坐标轴、曲线注释等多种功能, 而这些若由Qt来实现则较为复杂。针对Q t的绘图缺点, 提出了Qt与M AT L A B混合编程技术, 主要包括两种方法:Qt调用MATLAB的引擎和Qt调用MATLAB生成的动态链接库。Qt调用MATLAB引擎加入大量MATLAB库, 功能十分强大, 但其编程量巨大, 运行效率较低, 不利于开发使用。而使用MATLAB生成的动态链接库使程序可以脱离MATLAB环境独立运行, 节省程序所占用的内存资源, 提高了程序的执行效率。当然, 由于MATLAB7.0前后不同版本编译器的不同特点, 混合编程方法也会有所不同。下面本文将详细介绍如何将MATLAB函数转换为Qt可用的DLL的方法, 并应用到Qt雷达仿真系统工程中。

1 Qt图像显示窗口

1.1 显示窗口

Qt可以使系统获得高效的工作性能, 是因为它拥有一个重要机制——信号和槽机制[2]。信号和槽用于两个对象之间的通信, 信号和槽机制是Qt的核心特征, 也是Qt不同于其他开发框架最突出的特征。QWidget类是所有用户界面对象的基类, 是Qt中建立用户界面的主要元素。在雷达仿真系统中, 将图形显示模块作为一个封装的窗口组件嵌入到系统中, 窗口组件主要以窗口部件QWidget为基类, 嵌入MATLAB的Figure窗口[3], 使用信号和槽等实现数据处理和图形绘制。

1.2 绘图需求

随着雷达技术的不断发展, 雷达系统的复杂度与日俱增, 雷达系统的设计越来越多地借助仿真来提高工作效率。一套完整的Qt雷达仿真系统必不可少的就是图形显示, 用于直观地观测雷达各个模块的波形及运动轨迹。Qt提供了2D绘图系统[2], 可以使用API在屏幕和绘图设备上进行绘制, 主要基于QPainter、QPaint Device和QPaint Engine这3个类, 其中QPainter用来执行绘图操作, QPaint Device提供绘图设备, QPaint Engine提供了一些接口。同时, Qt的第三方绘图库QWT可生成各种统计图, 它的目标是以基于2D方式的窗体部件来显示数据。然而这两种绘图方法的编程过程比较复杂, 尤其在处理大量数据和三维图形显示时更是难以实现。MATLAB有强大的图形化显示矩阵和数组的能力, 同时也能给图形增加注释并且打印这些图形。它既包括一些方便地产生二维、三维技术专业图形的高级绘图函数, 也包括一些可以使用户灵活控制图形特点的低级绘图命令。另外, 用户还可以利用MATLAB的句柄图形技术创建图形用户界面[4]。这种语言可移植性好、可拓展性极强, 所以采用Qt与MATLAB混合编程的方法, 才能实现强大的图形处理功能。图1为雷达目标检测仿真结果图。

图2 Qt调用MATLAB动态链接库的过程流程图

2 Qt调用动态链接库

2.1 Qt调用动态链接库流程

Qt调用动态链接库主要有两种选择方案, 一种是利用VC++调用MATLAB生成的独立可执行的C++函数文件创建集成的绘图动态链接库, Qt窗口组件来调用它;另一种是Qt直接调用MATLAB生成的独立可执行的C++函数文件创建集成的绘图动态链接库, 然后Qt窗口组件使用这个动态链接库文件。由于VC++与MATLAB混合编程技术相对比较成熟, 并得到广泛应用, 所以我们选用第一种方案。图2展示了在Qt中调用动态链接库的步骤。

2.2 VC++动态链接库嵌入到Qt中

Qt窗口组件调用VC++动态链接库, 实现绘图和图形显示功能, 在工程目录中添加上述dll MATLAB.h、dll MATLAB.dll和dll MATLAB.lib文件。在工程的管理文件.pro中加载需要连接的动态链接库, 添加代码“LIBS+=-L./-ldll MATLAB”。在头文件中添加动态链接库提供的头文件的“dll MATLAB.h”。这样我们就可以调用MATLAB函数库中的绘图相关函数, 对数据进行图形处理了。

但是调用显示的Figure窗口却是单独显示的, 与Qt中窗口组件不一致, 为使界面风格统一, 用户界面美观, 我们需要将MATLAB的Figure窗口嵌入到Qt窗口组件中。这种方法的基本思路是去除MATLAB的Figure窗口的标题栏及边框, 然后把它移动到Qt窗口组件中, 同时设定Qt窗口组件为父窗口。具体由以下代码实现。获取MATLAB的Figure窗口句柄:

2.3 创建VC++动态链接库

要想在Qt中调用MATLAB的各种绘图函数, 满足工程需要, 使用动态链接库无疑是最好的选择。

动态链接库[6]是Windows操作系统中实现共享函数库概念的一种方式, 使进程可以调用不属于其可执行代码的函数。DLL可以采用多种编程语言来编写。例如, 可以利用Qt来编写程序界面, 然后调用VC++编写的完成绘图功能的DLL。动态链接库有助于共享数据和资源, 简化项目管理, 节省磁盘空间和内存, 更易于升级。

2.4 MATLAB数据类型与VC++数据类型相互转化

我们知道在MATLAB当中运算都是基于矩阵的, 因此, 在VC++中调用MATLAB函数时, 无论函数的返回值、参数必须是矩阵类型 (mw Array) [7], 而在C++当中的二维数组可以看成一个矩阵, 在VC++当中可以用下面的函数将数组转化成MATLAB中的矩阵类型。例如data=new double[m*n], 可以用mw Array mwdata (m, n, data) ;这样就可以将二维数组变量转化成mw Array类型, 进而可以作为MATLAB函数的参数。反之, 把mw Array类型的变量转化成C++中的二维数组:例如存在mw Array变量mwdata, 用函数size获得矩阵的大小, row=size (&col, mwdata) , 其中row, col是函数的返回值, data=new double[row*col];data.Extract Data (mwdata) ;这样就可以把mw Array类型转化成数组类型。另外, 用Get Data () 和mx Get Pr、mx Get Pi组合可以得到指向mw Array对象的指针。

3 VC++和MATLAB混合编程

3.1 VC++与MATLAB混合编程步骤

在工程实践中, VC++调用MATLAB的方法主要有两种:调用MATLAB计算引擎和调用MATLAB生成独立可执行的C++函数文件。为满足工程需要, 选择第二种方法。

3.1.1 在MATLAB中进行编译器设置

MATALB编译器是一个运行于MATLAB环境的独立工具。其主要功能是把M程序转换成C/C++代码, 然后再调用外部C/C++编译器, 把产生的源代码编译、链接成用户指定的格式[4]。

需要在MATLAB环境中配置外部C/C++编译器, 在MATLAB命令环境行输入mbuid-setup设置要用到的C/C++编译器。输入mex-setup对MEX文件进行配置编译。

3.1.2 新建M文件并编译

(1) 建立M文件, 将工程中需要用到的数学函数库和图形库中的常见函数plot、mesh、hist、image、figure、fft、contour、set、get等函数编写成M函数。功能相同的函数, 参数个数不同时要视为两个不同函数。

(2) 利用mcc命令编译M文件, 在MATLAB环境中使用mcc命令将M文件编译成可独立执行的C++函数文件。

3.1.3 在VC++中进行编译环境设置

首先设置系统变量, 在系统环境的用户变量添加MATLAB及VC++软件的安装目录。然后在VC++设置编译环境:

(1) 添加MATLAB库的头文件和库函数的路径;

(2) 设置运行时动态链接库;

(3) 导入静态链接库文件。

3.1.4 创建动态链接库

动态链接库是将功能封装在一起的模块, 因此, 与代码直接写入调用模块中相比, 它不仅可以提高程序的复用, 减少代码开发工作量, 同时也可以节省内存, 提高代码利用率。

VC++调用MATLAB混合编程生成可以独立运行的C++代码, 创建动态链接库, 通过静态加载或动态加载的方式来使用DLL。新建一个空的动态链接库工程, 添加一个头文件dll MATLAB.h和源文件dll MATLAB.cpp。将mcc编译后生成的C++文件添加到项目中, 对MATLAB中M文件中的函数重新定义, 满足MATLAB数据类型与VC++数组类型相互转化。编译生成dll MATLAB.dll和dll MATLAB.lib文件。这样其他应用程序只需将dll MATLAB.h、dll MATLAB.dll、dll MATLAB.lib添加到工程目录中就可以使用这个动态链接库, 实现调用MATLAB的绘图功能了。

3.2 MATLAB不同版本的区别

值得注意的是, 不同MATLAB软件版本导致混合编程的方法不同。与之前版本相比, MATLAB7.0之后的版本的编译器发生了较大变化。其主要新特点及变化包括以下两个方面:一、不再提供C++数字库和图形库;二、不再编译所有的M函数, 只是产生必要的C/C++接口函数。

所以VC++调用不同版本的MATLAB的动态链接库的过程也有很大差别, 具体表现在三个方面。

3.2.1 mcc命令及编译产生C++文件不同

MATLAB7.0之前的版本编译命令为:mcc-B sglcpp (文件名) , 参数“-B sglcpp”含义是将.m文件编译成为C++代码, 生成.cpp和.hpp文件, 提供图形库支持, 并编译为独立运行的exe程序。

MATLAB7.0之后版本使用mcc命令。假设要把M文件编译成C语言动态链接库文件“mcc-W lib: (对应链接库名称) -T link:lib (文件名M) ”。假设要把M文件编译成C++语言动态链接库文件:“mcc-W cpplib: (对应链接库名称) -T link:lib (文件名M) ”。这里我们采用第二种方法编译运行之后, 在目录下面将会出现以下以.lib、.dll、.exports、.exp、.h和.cpp为后缀的6个文件。

3.2.2 在VC++工程中头文件及初始化设置等不同

在MATLAB7.0以前, 在VC++程序中使用MATLAB编译器产生代码时, 必须在VC++源程序中分别包含MATLAB.h p p。从M ATA L B 7.0起, M AT L A B的编译器不再提供MATLAB.hpp, 代之以mclmcr.h。

另外, 在调用MATLAB初始化设置时, MATLAB7.0以前采用以下代码:

MATLAB7.0之后版本编译产生的动态链接库, 对每个M文件都有初始化及释放设置, 也就是说不需要整体的初始化及释放设置, 只需对使用的函数进行初始化, 具体参考MATLAB帮助。

3.2.3 程序发布方法有所不同

由于程序中调用了MATLAB数学函数库或图形库中的函数, MATLAB7.0之前版本需要附带MATLAB的这些函数库才能在没有安装MATLAB的机器上运行。以MTALAB6.5为例, 我们需要收集libmmfile.dll、libmwservices.dll、libut.dll等函数库, 并将这些文件添加到应用程序Debug目录或者Release目录下, 这样程序就可以未装MATLAB软件的机器上运行, 简化了MATLAB与C/C++的混合编程, 可移植性强。

MATLAB7.0之后版本的编译器不再提供C++数字库和图形库, 而是使用MATLAB组件运行环境MCR (一组标准的动态链接库) , 它提供了运行编译后的程序所需的基本环境[4]。所以要想程序发布到别的没有安装MATLAB的计算机上使用, 必须在目标计算机上安装MCR, 其文件位于MATLAB安装目录的externlibwin32子目录MCRInstaller.exe, 运行MCRInstaller.exe程序即可自动把需要的库函数解压到当前目录中, 这样程序就可以脱离MATLAB运行。

通过对比发现, 不同版本各有优势, 在我们的工程项目中选用了MATLAB6.5, 这样要想发布VC++创建的动态链接库只需收集库文件, 虽然收集过程复杂, 但是可移植性强, 灵活性高, 用户操作简单。

4 总结

本文采用Qt与MATLAB混合编程的方法满足了Qt工程中对数据处理和图形显示的要求, 增强了Qt的绘图功能。经过项目的实践, 调用MATLAB生成的可独立执行的动态链接库在项目中得到了较好的应用。当然, 集成的动态链接库还需要进一步地完善来满足不同的项目对绘图及复杂数值运算的要求, 为用户提供功能强大的开发平台。由于Qt优良的跨平台特性和MATLAB的图形处理功能, 相信未来Qt与MATLAB的混合编程在嵌入式系统的应用前景会更加广阔。

参考文献

[1]霍亚飞.Qt Creator快速入门 (第2版) [M].北京:北京航空航天大学出版社, 2014.

[2]丁林松, 黄丽琴.Qt4图形设计与嵌入式开发[M].北京:人民邮电出版社, 2009.

[3]张亮, 王继阳等.MATLAB与C/C++混合编程[M].北京:人民邮电出版社, 2008.

[4]董维国.深入浅出MATLAB7.x混合编程[M].北京:机械工业出版社, 2005.

[5]魏鑫, 陈辉强, 高飞.Qt与MATLAB的混合编程究与实现[J].计算机与现代化, 2010, 9 (1) :168-170.

[6]孙鑫, 余安萍.VC++深入详解[M].北京:电子工业出版社, 2006.

[7]刘维.精通MATLAB与C/C++混合程序设计 (第2版) [M].北京:北京航空航天大学出版社, 2008.

[8]马兴义.MATLAB6应用开发指南[M].北京:机械工业出版社, 2002.

编程语言matlab 篇10

VB具有方便的资源文件集中管理模式、开发周期短、开发环境友好等特点。MATLAB具有强大的计算机绘图能力, 并且提供大量的数据库, 但是界面开发能力差、代码运行效率低。将VB与MATLAB的特点结合起来, 运用VB与MATLAB混合编程实现仿真, 使两者相得益彰, 不失为一种有益的尝试。

1 VB与MATLAB接口编程方法

VB与MATLAB混合编程有多种方法, 各有优缺点, 主要有下面几种方法。

1.1 利用ActiveX技术

ActiveX自动化 (OLE自动化) 协议是一种允许一个应用程序 (控制端) 去控制另一个应用程序 (服务器端) 的协议。在VB下通过ActiveX自动化接口可将MATLAB作为Visual Basic语言的一个ActiveX部件调用。但是这种方法不能脱离MATLAB运行环境, 占用计算机内存较大。

1.2 利用可执行文件技术

这种方法将MATLAB的运算模块生成可执行的exe文件, 然后在VB运行环境下调用。这种方法占用内存较小, 运行效率较高。

1.3 利用MatrixVB技术

MatrixVB 是 MathWorks 公司为 VB 开发的插件, 插件增强了 VB 绘图和计算的函数集合。它包括基本的数学运算和功能强大的信号处理、线性代数、串运算及图形图像处理功能, 用来补充 VB 本身内建函数和图形处理的不足。这种方法运行效率高、占用内存小。

1.4 利用动态数据交换 (DDE) 技术

动态数据交换 (DDE) 是在Windows环境下支持客户/服务器计算模式的重要技术。由于VB支持DDE客户端功能, MATLAB提供了DDE服务功能, 因此, 利用VB和MATLAB的动态数据交换能力, 可以实现在VB应用程序中调用MATLAB。但这种方法仍然不能脱离MATLAB运行环境, 占用资源较大。

1.5 利用com组件技术

MATLAB提供了COM编译器。它能将一个m文件编译成dll文件供VB调用。这种技术可以脱离MATLAB运行环境, 但是生成的dll文件必须进行注册。

综上所述, 几种技术各有优缺点, 可根据需要采用不同的技术。

2 利用com组件技术的混编

从图1中可以看出, 首先利用MATLAB编写m函数, 然后利用com组件技术生产dll文件, 注册该dll文件。VB调用生产的dll文件, 最后生成可以执行的文件。

根据上述过程, 要求编写一个VB与MATLAB混编的程序, 显示y=ax2+bx+c的图形, 利用com组件技术可以实现。首先在MATLAB平台下输入以下函数: function abc (a, b, c) ;%输入为三个参数

x=[-10:0.01:10];%定义x的范围

y=a*x.^2+b*x+c;% y=ax2+bx+c

plot (x, y) ;%绘图

hold on

end

将编写好的函数保存为abc.m, 在MATLAB中输入mbuild-setup, 根据提示选择编译器为:Microsoft Visual C/C++ version 6.0 in C:Program FilesMicrosoft Visual Studio (需要安装C++) 。再输入comtool命令, 出现对话框, 选择file-new project, 添加之前生成的abc.m。定义类为theabc, 选择build-com object。此时可以生成一个theabc的文件夹, 内含文件theabc_1_0.dll。退出MATLAB环境, 打开VB, 新建一个标准exe, 选择工程—引用—theabc 1.0 Type Library。在form中添加3个文本框, 分别用来显示a、b、c。两个命令按钮, 用来执行画图命令和退出。输入:

运行程序, VB界面如图2所示。

此时, y=x2+2x+1, 单击绘图按钮, 出现图3。

改变a、b、c的值, 单击绘图按钮, 出现不同的图形, 这样一个y=ax2+bx+c的VB与MATLAB混编绘图程序就生成了。

3 利用MatrixVB技术的混编

与com组件技术相比, MatrixVB技术不需要生成dll文件, 而是直接把MatrixVB作为VB的一个com组件。可以加强VB内建数学运算与图形展示功能, 在VB程序代码中可以像使用VB自己的函数一样使用MatrixVB的函数, 而且可以不依赖于MATLAB的环境在Visual Basic中完成矩阵运算与图形绘制显示等功能, 这种方法使用起来简单, 编程效率较高。MatrixVB函数库的功能大致可分为8大类:矩阵运算、运算符重载、图形图像处理、最优化运算、多项式、信号处理、随机与统计分析、控制系统。

要运用MatrixVB技术, 首先在计算机中安装MatrixVB程序, 然后打开VB程序, 新建一个标准exe, 选择工程—引用—MMatrix。以y=ax2+c为例, 利用MatrixVB技术画出y=ax2+c的图形。在VB的form中新建两个文本框, 分别用来显示a和c, 两个命令按钮, 分别用来执行绘图和退出命令。在命令窗口输入以下命令:

运行程序, 得到的VB界面如图4所示。

在文本框中分别输入1, 0。单击绘图按钮, 这时y=x2得到的图形如图5所示。

输入其它数值, 得到不同的图形, 这样, 利用MatrixVB技术的VB与MATLAB混编的y=ax2+c就完成了。

4结语

利用com技术和MatrixVB技术实现了VB与MAT-LAB的混合编程, 两种方法都脱离了MATLAB运行环境, 占用计算机内存较少。两种方法都充分利用了VB和MATLAB的长处, VB的界面制作、MATLAB强大的运算功能都得到了很好的发挥。

摘要:介绍了VB与MATLAB混合编程的5种方法, 分别利用com组件技术与MatrixVB完成了VB与MAT-LAB混编, 实现了图像的绘制。从两种实验结果来看, 这两种方法占用计算机内存小, 且编程语言简单, 充分利用了VB与MATLAB的特点, 简化了编程过程。

关键词:VB,MATLAB,com组件,MatrixVB

参考文献

[1]谭浩强, 袁玫, 薛淑斌.Visual basic程序设计[M].北京:清华大学出版社, 2006.

[2]朱志松, 郭晓丽, 朱小松, 等.VB与MATLAB混合编程探讨[J].电子技术应用, 2003 (9) .

[3]胡静, 吴云, 张燕, 等.基于COM组件的VB与MATLAB混合编程技术在地形变数据分析中的应用[J].大地测量与地球动力, 2011 (z1) .

[4]李永曦.在VB6.0中调用MATLAB程序[J].微机发展, 2004 (1) .

上一篇:和弦应用下一篇:改革数学教学