第六章 MATLAB编程.ppt
第六章第六章 MATLAB编程编程6.1 编程入门编程入门6.2 函数(命令)文件概念函数(命令)文件概念6.3 转向语句转向语句6.4 循环语句循环语句我们已经知道,我们已经知道,MATLAB的每一个命令是一个子程序,我们可以把的每一个命令是一个子程序,我们可以把它当作一个具有相当功能的集成块。如果我们将这些集成块有机地它当作一个具有相当功能的集成块。如果我们将这些集成块有机地组合在一起,将产生相当强大的功能,这就是编制程序。显而易见,组合在一起,将产生相当强大的功能,这就是编制程序。显而易见,这样编制的程序结构简单,编程方便,特别是对具有这样编制的程序结构简单,编程方便,特别是对具有C、FORTRAN编程经验的使用者。我们还可以很方便地对编程经验的使用者。我们还可以很方便地对MATLAB命命令集进行扩充,即我们可以编制自己的一套算法程序并命名为一个令集进行扩充,即我们可以编制自己的一套算法程序并命名为一个函数命令,这正是函数命令,这正是MATLAB的优点之一。我们可以在的优点之一。我们可以在MATLAB网网站上看到世界各地的各学科的科学工作者贡献的各种子命令。站上看到世界各地的各学科的科学工作者贡献的各种子命令。MATLAB程序具有程序具有C、FORTRAN 的结构,如循环结构、条的结构,如循环结构、条件转向结构等等,对于变量来说也分局部变量和全局变量。在数学件转向结构等等,对于变量来说也分局部变量和全局变量。在数学建模竞赛中,我们是将我们的各项实验和探索最终编制成程序进行建模竞赛中,我们是将我们的各项实验和探索最终编制成程序进行计算的。在这一章我们将介绍编程的基本概念和编程的步骤,特别计算的。在这一章我们将介绍编程的基本概念和编程的步骤,特别关注在程序中使用各种数据的输入和输出的命令,如何将目前流行关注在程序中使用各种数据的输入和输出的命令,如何将目前流行的关系数据库的数据读入到我们的的关系数据库的数据读入到我们的MATLAB程序中,以及将计算结程序中,以及将计算结果在输出到这些数据库中的方法,这在数学建模竞赛中是非常重要果在输出到这些数据库中的方法,这在数学建模竞赛中是非常重要的处理数据的方法。的处理数据的方法。MATLAB的每一个命令或者说函数事实上是一个子程序,我的每一个命令或者说函数事实上是一个子程序,我们可以把它当作一个具有相当功能的集成块。如果我们将这些集们可以把它当作一个具有相当功能的集成块。如果我们将这些集成块有机地组合在一起将产生相当强大的功能,这就是编制程序。成块有机地组合在一起将产生相当强大的功能,这就是编制程序。6.1 编程入门编程入门我们来编程序,并把它定义成一个我们来编程序,并把它定义成一个MATLAB的函数(命令)。的函数(命令)。【例例6.1.1】求两求相交的交线,并作两球和交线图形。求两求相交的交线,并作两球和交线图形。解解题题思思路路:首首先先建建立立两两球球的的方方程程,利利用用solve命命令令求求解解交交线线方方程程的的的公式,然后利用作图命令将三个图形作在一起。的公式,然后利用作图命令将三个图形作在一起。(1)编写)编写M脚本文件的步骤脚本文件的步骤 l点点击击MATLAB指指令令窗窗工工具具条条上上的的New File图图标标,就就可可打打开开 如如 图图 6.1.1所所 示示 的的 MATLAB文文 件件 编编 辑辑 调调 试试 器器 MATLAB Editor/Debugger。其其窗窗口口名名为为untitled,用用户户即即可可在在空空白白窗窗口口中中编编写程序。比如输入如下一段程序写程序。比如输入如下一段程序%2004年四月二十六日,两球相交作图。年四月二十六日,两球相交作图。syms a b x y a1 b1 t c=2.1%在在x轴平移的参数轴平移的参数S=solve(x2+y2=1,(x-c)2+y2=2)%解平面两圆方程解平面两圆方程u=subs(S.x(1)v=subs(abs(S.y(1)t=linspace(0,2*pi,100)u1(1,1:100)=u%产生球体数据产生球体数据X,Y,Z=sphere(30);X1=sqrt(2)*X+cY1=sqrt(2)*YZ1=sqrt(2)*Zmesh(X,Y,Z),hidden off;hold onaxis equal,axis(-1,3.5,-2.5,2.5,-1.5,1.5)mesh(X1,Y1,Z1),hold onplot3(u1,v*sin(t),v*cos(t),linewidth,6);hold onX1=sqrt(2)*X+uY1=sqrt(2)*YZ1=sqrt(2)*Zmesh(X,Y,Z),hidden off;hold offl点点击击运运行行工工具具条条图图标标,在在第第一一次次运运行行时时将将弹弹出出的的Windows标标准准风风格格的的“保保存存为为”对对话话框框中中,选选择择保保存存文文件件夹夹,键键入入新新编编文文件件名名(如如example1),点点动动【保保存存】键键,就就完完成成了了文文件件保保存存并出现如下提示界面。并出现如下提示界面。直直接接电电击击OK便便开开始始运运行行,如如果果没没有有语语法法等等问问题题,则则结结果果图图将将显显示示出出来来。如如果果有有错错误误会会听听见见嘟嘟的的一一声声响响,这这时时打打开开命命令令窗窗口口我我们们可可以以看看见见有有红红色色的的提提示示符符,告告诉诉你你在在程程序序的的第第几几行行有有什什么么错错误误。我我们们可可以以检检查查修修改改直直到到顺顺利利运运行行。分分段段函函数数的的图图形见下图形见下图6.1.1 MATLAB 函数文件函数文件 我我们们可可以以把把上上面面的的程程序序稍稍微微修修改改一一下下让让它它变变为为函函数数的的形形式式,这这样样我我们们就就可可以以象象使使用用其其他他命命令令一一样样来来使使用用这这个个命命令令了了。我我们们可可以以在在M文文件件中中加加入入这这些些函函数数命命令令,就就象象C、FORTRAN等等高高级级语语言言中中的的子子程程序序,从从而而大大大大提提高高了了程程序序的的效效率率和和可可读读性性。函函数数程程序序必必须须以以关关键字键字function开头。开头。【例例6.1.2】将上面的两球交线的作图将上面的两球交线的作图m文件改成函数文件。文件改成函数文件。对上面的程序只要稍加修改我们就可以产生一个对上面的程序只要稍加修改我们就可以产生一个MATLAB函数文件函数文件了,即在上面的程序中加一行函数说明关键字了,即在上面的程序中加一行函数说明关键字function,在程序的,在程序的结尾加关键字结尾加关键字end见下面的程序。见下面的程序。function H=two_ball1(c)%2004年四月二十六日,两球相交作图。年四月二十六日,两球相交作图。syms a b x y a1 b1 t%c=2.1%在在x轴平移的参数轴平移的参数S=solve(x2+y2=1,(x-c)2+y2=2)%解平面两圆方程解平面两圆方程u=subs(S.x(1)v=subs(abs(S.y(1)t=linspace(0,2*pi,100)u1(1,1:100)=uX,Y,Z=sphere(30);X1=sqrt(2)*X+cY1=sqrt(2)*YZ1=sqrt(2)*Zmesh(X,Y,Z),hidden off;hold onaxis equal,axis(-1,3.5,-2.5,2.5,-1.5,1.5)mesh(X1,Y1,Z1),hold onplot3(u1,v*sin(t),v*cos(t),linewidth,6);hold on给程序加一个头给程序加一个头X1=sqrt(2)*X+uY1=sqrt(2)*YZ1=sqrt(2)*Zmesh(X,Y,Z),hidden off;hold offend这里:这里:function H=two_ball1(c)定义了一个函数名定义了一个函数名two-ball1,小括号里的变量为输入参数,小括号里的变量为输入参数c,为两,为两球的距离。球的距离。然后将该修改过的程序保存为程序名为然后将该修改过的程序保存为程序名为two-ball1的的MATLAB文件,文件,我们事实上已经为我们事实上已经为MATLAB的命令集合中又添加了一个新的命令,的命令集合中又添加了一个新的命令,它可以向其他命令一样的使用。它可以向其他命令一样的使用。给程序加个尾给程序加个尾方法方法1:在命令窗口键入:在命令窗口键入:c=2.2 two-ball1(c)就可以得到和上例一样的结果了。事实上我们定义了一个就可以得到和上例一样的结果了。事实上我们定义了一个MATLAB的新命令的新命令.方法方法2:例如编一段小程序,调用该函数。:例如编一段小程序,调用该函数。c=2;two-ball1(c)运行该段程序运行该段程序,也可以产生上面一样的结果。也可以产生上面一样的结果。6.1.2 m脚本文件和函数文件脚本文件和函数文件 上面我们介绍了两种类型的上面我们介绍了两种类型的MATLAB文件,它们都是用文件,它们都是用MATLAB语言要素汇编而成,但是其作用却有本质的不同,语言要素汇编而成,但是其作用却有本质的不同,m脚本文件:为完成某计算任务而编写的程序称脚本文件。脚本文件:为完成某计算任务而编写的程序称脚本文件。函数文件:以函数文件:以function开头的为完成某项任务的程序称为函数文件。开头的为完成某项任务的程序称为函数文件。以下表格以下表格6.1.1列出它们的不同和相同之处。列出它们的不同和相同之处。从中我们可以看出,从中我们可以看出,m脚本文件有些象脚本文件有些象FORTRAN语言里的主程序,语言里的主程序,而函数文件的功能很象而函数文件的功能很象SUBROUTINE子程序,可以被其他程序调子程序,可以被其他程序调用。用。6.2 循环和转向语句循环和转向语句 像其他的高级语言一样,我们也可以使用循环和转向语句。这像其他的高级语言一样,我们也可以使用循环和转向语句。这样我们就可以将样我们就可以将MATLAB的各种函数有机地组成效率非常高的的各种函数有机地组成效率非常高的复杂运算了。由于循环和转向语句在复杂运算了。由于循环和转向语句在FORTRAN或或C语言中都有语言中都有详细的介绍,详细的介绍,MATLAB中的循环和转向语句功能基本一样,仅中的循环和转向语句功能基本一样,仅仅是语言略有不同,因此仅以实例简单介绍。仅是语言略有不同,因此仅以实例简单介绍。6.2.1 for 循环语句循环语句for循环语句的语法结构为:循环语句的语法结构为:for x=循环范围循环范围 循环体循环体end其中循环体可以是一个命令,也可以是一端源程序。其中循环体可以是一个命令,也可以是一端源程序。【例【例6.2.1】一个简单的】一个简单的for循环示例。循环示例。for i=1:10;%i依次取依次取1,2,10。x(i)=i;%对每个对每个i值,重复执行由该命令构成的循环体。值,重复执行由该命令构成的循环体。end;x%要求显示运行后数组要求显示运行后数组x的值。的值。x=1 2 3 4 5 6 7 8 9 10 6.2.2 while循环语句循环语句while循环语句的语法结构为:循环语句的语法结构为:while 表达式表达式 命令集合命令集合end【例【例6.2.2】Fibonacci数组的元素满足数组的元素满足Fibonacci 规则:规则:,且且 。现要求该序列中第一个大于现要求该序列中第一个大于10000的元素。的元素。a(1)=1;a(2)=1;i=2;while a(i)8 sums=number*0.95*cost;endsums sums=114.0000 6.2.4 switch-case 结构结构switch-case分支结构的语法为:分支结构的语法为:switch ex ex为变量或字符串变量为变量或字符串变量 case test1命令集合命令集合1 case test2命令集合命令集合2 case testk命令集合命令集合kend【例【例6.2.4】学生的成绩管理,用来演示】学生的成绩管理,用来演示switch结构的应用。结构的应用。clear;%划分区域:满分划分区域:满分(100),优秀,优秀(90-99),良好,良好(80-89),及格,及格(60-79),不及格,不及格(1 xz=x;elseif nargout=1 xz=z;else%Self demonstration disp()disp(z=3*(1-x).2.*exp(-(x.2)-(y+1).2).)disp(-10*(x/5-x.3-y.5).*exp(-x.2-y.2).)disp(-1/3*exp(-(x+1).2-y.2)disp()surf(x,y,z)axis(min(min(x)max(max(x)min(min(y)max(max(y).min(min(z)max(max(z)xlabel(x),ylabel(y),title(Peaks)end当我们在命令行中键入:当我们在命令行中键入:help peaks 回车键回车键则产生以下帮助信息,它们正好是则产生以下帮助信息,它们正好是peaks函数的在线帮助中的注释函数的在线帮助中的注释内容。内容。PEAKS A sample function of two variables.PEAKS is a function of two variables,obtained by translating and scaling Gaussian distributions,which is useful for demonstrating MESH,SURF,PCOLOR,CONTOUR,etc.There are several variants of the calling sequence:Z=PEAKS;Z=PEAKS(N);Z=PEAKS(V);Z=PEAKS(X,Y);PEAKS;PEAKS(N);PEAKS(V);PEAKS(X,Y);.6.4.2 子函数和私密函数(子函数和私密函数(Subfunctions&Private Functions)子函数(子函数(Subfunctions)和高级语言一样,在和高级语言一样,在MATLAB编程中也有子程序即子函数的概编程中也有子程序即子函数的概念。在一个念。在一个m函数文件中,可以包含若干个子函数,定义格式和函数文件中,可以包含若干个子函数,定义格式和m函数一样。而包含这些子函数的函数称为主函数函数一样。而包含这些子函数的函数称为主函数【例【例6.3.2】一个函数的任务是计算数组的均值和中位数,在这个】一个函数的任务是计算数组的均值和中位数,在这个m函数本身包含一个计算平均值和一个计算中位数的子函数。函数本身包含一个计算平均值和一个计算中位数的子函数。function avg,med=newstats(u)%主函数主函数%NEWSTATS Find mean and median with internal functions.n=length(u);avg=mean(u,n);med=median(u,n);function a=mean(v,n)%计算均值的子函数计算均值的子函数%Calculate average.a=sum(v)/n;function m=median(v,n)%计算中位数的子函数计算中位数的子函数%Calculate median.w=sort(v);if rem(n,2)=1 m=w(n+1)/2);else m=(w(n/2)+w(n/2+1)/2;end将将m函数存到当前目录中,并在命令出口键入:函数存到当前目录中,并在命令出口键入:u=rand(1,100)%产生一个产生一个100元素的随机数数组元素的随机数数组 a,b=newstats(u)%调用函数计算均值和方差调用函数计算均值和方差这里主函数将这里主函数将u作为输入变量,然后调用两个计算子函数,并将计作为输入变量,然后调用两个计算子函数,并将计算结果传给主函数作为输出变量。算结果传给主函数作为输出变量。注意:当我们用注意:当我们用help语句对主函数寻求帮助时,看不见自函数的帮语句对主函数寻求帮助时,看不见自函数的帮助内容,而只能看见主程序中的帮助内容。助内容,而只能看见主程序中的帮助内容。2)私密函数(私密函数(Private Functions)当我们在开发大型的应用软件时,我们的软件工程包括了大量当我们在开发大型的应用软件时,我们的软件工程包括了大量的函数和子函数,在这么多的文件中,我们可以按照调用层次的函数和子函数,在这么多的文件中,我们可以按照调用层次分别方在父目录和子目录中。例如父目录名为分别方在父目录和子目录中。例如父目录名为newmath,而子,而子目录名为目录名为private。那些存放在。那些存放在private目录中的函数就称为私密目录中的函数就称为私密函数,只有那些在父目录中的函数才能调用这些私密函数。或函数,只有那些在父目录中的函数才能调用这些私密函数。或者说私密函数对不在父目录中其他函数实施了屏蔽。这有时是者说私密函数对不在父目录中其他函数实施了屏蔽。这有时是非常有用的,因为私密目录中的函数名可以和其他目录中的文非常有用的,因为私密目录中的函数名可以和其他目录中的文件名一样,但在父目录中的函数首先调用私密目录中的同名文件名一样,但在父目录中的函数首先调用私密目录中的同名文件。件。6.5 界面设计与编程界面设计与编程 界面编程已经成为程序编制重要任务之一,无论是软件开发还界面编程已经成为程序编制重要任务之一,无论是软件开发还是各种实验程序的设计都离不开界面设计与编程。是各种实验程序的设计都离不开界面设计与编程。7.4.1 图形用户界面的设计原则和一般步骤:图形用户界面的设计原则和一般步骤:一、设计原则一、设计原则由于要求不同,设计出来的界面也就千差万别。但是,自从人们开由于要求不同,设计出来的界面也就千差万别。但是,自从人们开始设计图形界面以来,界面设计的评判标准却没有太大的变化。简始设计图形界面以来,界面设计的评判标准却没有太大的变化。简单说来,一个好的界面应遵循以下三个原则:简单性(单说来,一个好的界面应遵循以下三个原则:简单性(Simplicity)、)、一致性(一致性(Consistency)、及习常性()、及习常性(Familiarity)。)。(1)简单性)简单性设计界面时,应力求简洁、直接、清晰地体现出界面的功能和特征。设计界面时,应力求简洁、直接、清晰地体现出界面的功能和特征。那些可有可无的功能,应尽量删去,以保持界面的整洁。设计的图那些可有可无的功能,应尽量删去,以保持界面的整洁。设计的图形界面要直观,为此应多采用图形,而尽量避免数值。设计界面应形界面要直观,为此应多采用图形,而尽量避免数值。设计界面应尽量减少窗口数目,力避在不同窗口之间进行来回切换。尽量减少窗口数目,力避在不同窗口之间进行来回切换。(2)一致性一致性 所谓一致性有两层含义:一是读者自己开发的界面风格要尽量所谓一致性有两层含义:一是读者自己开发的界面风格要尽量一致;二是新设计的界面要与其他已有的界面风格不要截然相一致;二是新设计的界面要与其他已有的界面风格不要截然相左。这是因为用户在初次使用新界面时,总习惯于凭经验进行左。这是因为用户在初次使用新界面时,总习惯于凭经验进行试探。比方说,图形显示区常安排在界面左边,而按键等控制试探。比方说,图形显示区常安排在界面左边,而按键等控制区被排在右侧。区被排在右侧。(3)习常性)习常性 设计新界面时,应尽量使用人们所熟悉的标致和符号。用户可设计新界面时,应尽量使用人们所熟悉的标致和符号。用户可能并不了解新界面的具体含义及操作方法,但他完全可以根据熟悉能并不了解新界面的具体含义及操作方法,但他完全可以根据熟悉标致作出正确猜测,自学入门。标致作出正确猜测,自学入门。(4)其他考虑因素)其他考虑因素除了以上对界面的静态要求外,还应注意界面的动态性能。如果面除了以上对界面的静态要求外,还应注意界面的动态性能。如果面对用户操作的响应要迅速(对用户操作的响应要迅速(Immediate)、连续()、连续(Continous););对持续时间较长的运算,要给出等待时间提示,并允许用户中对持续时间较长的运算,要给出等待时间提示,并允许用户中断运算。断运算。7.4.2 界面设计的步骤界面设计的步骤(1)分析界面所要求实现的主要功能,明确设计任务。)分析界面所要求实现的主要功能,明确设计任务。(2)在稿纸上绘出界面草图,并站在使用者的角度来审查草图。)在稿纸上绘出界面草图,并站在使用者的角度来审查草图。(3)按构思的草图,上机制作(静态)界面。并检查之。)按构思的草图,上机制作(静态)界面。并检查之。(4)编写界面动态功能的程序,对功能进行逐项检查。)编写界面动态功能的程序,对功能进行逐项检查。例例 7.4.1 作一个界面,有一个输入框,一个输出框和两个动作框。作一个界面,有一个输入框,一个输出框和两个动作框。对输入的字符转为大写或小写。本程序包括:对输入的字符转为大写或小写。本程序包括:(1)用)用figure命令建立带有菜单的图形界面命令建立带有菜单的图形界面(2)利用)利用uicontrol()命令建立两个编辑筐和两个按纽()命令建立两个编辑筐和两个按纽(3)利用)利用callback属性将这些图形目标有机的连在一起属性将这些图形目标有机的连在一起h0=figure(toolbar,none,.position,200 150 350 250,.name,实例实例7.4.1);%建立带菜单的图形父界面建立带菜单的图形父界面f=Please input the letter;%字符串在第一图形框中显示字符串在第一图形框中显示%调用命令,将小写的字符串变为大写并显示在第二编辑框中调用命令,将小写的字符串变为大写并显示在第二编辑框中huidiao1=.g=upper(f);,.set(h2_edit,string,g),.;%调用命令,将大写的字符串变为小写并显示在第二编辑框中调用命令,将大写的字符串变为小写并显示在第二编辑框中huidiao2=.g=lower(f);,.set(h2_edit,string,g),.;%创建第一编辑框,可以任意输入字符串。创建第一编辑框,可以任意输入字符串。h1_edit=uicontrol(gcf,style,edit,.position,100 200 100 50,.HorizontalAlignment,left,.string,Please input the letter,.callback,f=get(h1_edit,string);,.background,w,.max,5,.min,1);%创建第二编辑框,可以显示字符串。创建第二编辑框,可以显示字符串。h2_edit=uicontrol(gcf,style,edit,.HorizontalAlignment,left,.position,100 100 100 50,.background,w,.max,5,.min,1);%创建第一按纽框,调用前面定义的函数创建第一按纽框,调用前面定义的函数huidiao1,即小写变大写,即小写变大写h1_button=uicontrol(gcf,style,pushbutton,.string,小写变大写小写变大写,.position,100 45 100 20,.callback,huidiao1);%创建第一按纽框,调用前面定义的函数创建第一按纽框,调用前面定义的函数huidiao1,即小写变大写,即小写变大写h2_button=uicontrol(gcf,style,pushbutton,.string,大写变小写大写变小写,.position,100 20 100 20,.callback,huidiao2);6.6 建立图形目标的命令建立图形目标的命令(1)figure命令建立图形父目标命令建立图形父目标基本语法:基本语法:Figure%使用内定参数创建图形使用内定参数创建图形figure(PropertyName,PropertyValue,.)%选择图形创建图形选择图形创建图形figure(h)%创建第创建第h个图形个图形h=figure(.)%创建句柄图形创建句柄图形利用利用PropertyName我们可以设置图形的大小、图形菜单、图形的位我们可以设置图形的大小、图形菜单、图形的位置、图形的颜色等等各种属性。见前例中:置、图形的颜色等等各种属性。见前例中:h0=figure(toolbar,none,.%不建立工具图标不建立工具图标 position,200 150 350 250,.%指出图形的位置、大小指出图形的位置、大小 name,实例实例7.4.1);%显示图形的名称显示图形的名称图形属性列表:图形属性列表:(2)uicontrol()命令在父图形目标上建立子目标()命令在父图形目标上建立子目标在有在有figure建立的图形目标下,我们可以建立一下列的子目标如,建立的图形目标下,我们可以建立一下列的子目标如,图形输出框、文字输入输出框、选择框、滑动选择框等等,统称为图形输出框、文字输入输出框、选择框、滑动选择框等等,统称为控件。建立这些控件我们使用控件。建立这些控件我们使用uicontrol()。其语法为:()。其语法为:handle=uicontrol(parent)handle=uicontrol(.,PropertyName,PropertyValue,.)控件名控件名设定各种属性设定各种属性上例中:上例中:%创建第一按纽框,调用前面定义的函数创建第一按纽框,调用前面定义的函数huidiao1,即小写变大写,即小写变大写h1_button=uicontrol(gcf,style,pushbutton,.string,小写变大写小写变大写,.position,100 45 100 20,.callback,huidiao1);(3)控件的类型:)控件的类型:Check boxes%校对框校对框Editable text%编辑框编辑框Frames%一般框架一般框架List boxes%列表框列表框Pop-up menus%多项选择框多项选择框 Push buttons%按纽控件按纽控件Radio buttons%旋转按纽控件旋转按纽控件Sliders%滑动选择控件滑动选择控件Static text%文字显示框文字显示框Toggle buttons%选择按纽选择按纽(4)控件的属性控件的属性我们可以参考下面的列表:我们可以参考下面的列表:(5)控件击活)控件击活当我们利用设置界面命令在父图形上建立了很多的控件后,他们并当我们利用设置界面命令在父图形上建立了很多的控件后,他们并不能有相互之间的调用和击活动作,这就需要我们加进一些属性设不能有相互之间的调用和击活动作,这就需要我们加进一些属性设置来进行击活。例如:置来进行击活。例如:h1_edit=uicontrol(gcf,style,edit,.position,100 200 100 50,.HorizontalAlignment,left,.string,Please input the letter,.callback,f=get(h1_edit,string);,.background,w,.max,5,.min,1);这里对属性这里对属性callback进行进行设置,即获取编辑框设置,即获取编辑框h1-edit的字符串。的字符串。例例7.4.2 设置光源来源坐标设置光源来源坐标 h0=figure(toolbar,none,.position,198 56 408 468,.name,实例实例53);h1=axes(parent,h0,.position,0.15 0.5 0.7 0.5,.visible,off);x,y=meshgrid(-8:0.5:8);r=sqrt(x.2+y.2)+eps;z=sin(r)./r;fh=surf(x,y,z);shading interpview(-60 30)camlight leftlightk=light(position,0-2 1);button1=uicontrol(parent,h0,.style,pushbutton,.string,设置光线设置光线,.position,80 60 70 30,.callback,.an1=inputdlg(光线来源的光线来源的X轴坐标轴坐标);,.k1=str2num(an11);,.an2=inputdlg(光线来源的光线来源的Y轴坐标轴坐标);,.k2=str2num(an21);,.an3=inputdlg(光线来源的光线来源的Z轴坐标轴坐标);,.k3=str2num(an31);,.set(lightk,position,k1 k2 k3);,.set(edit1,string,num2str(k1),num2str(k2),num2str(k3),););button2=uicontrol(parent,h0,.style,pushbutton,.string,关闭关闭,.position,250 60 70 30,.callback,close);edit1=uicontrol(parent,h0,.style,edit,.max,2,.min,0,.fontsize,15,.backgroundcolor,1 1 1,.string,0-2 1,.position,80 110 220 30);text1=uicontrol(parent,h0,.style,text,.backgroundcolor,0.75 0.75 0.75,.fontsize,15,.string,光线来源坐标光线来源坐标,.position,80 140 220 30);6.6 可视化编程可视化编程 直接编程产生图形目标有时不方便、不直观。现代编程经常使直接编程产生图形目标有时不方便、不直观。现代编程经常使用视化编程简单方便。用视化编程简单方便。MATLAB提供了可视化编程界面,我们可以提供了可视化编程界面,我们可以利用各种控件按纽进行设计。利用各种控件按纽进行设计。(1)进入可视化编程界面)进入可视化编程界面在命令窗口键入在命令窗口键入guide命令命令选择选择常规按纽常规按纽按纽按纽旋转按纽旋转按纽校对按纽校对按纽编辑按纽编辑按纽文本按纽文本按纽滑动按纽滑动按纽列表按纽列表按纽多选择按纽多选择按纽图形输出按纽图形输出按纽例例7.6.1 选择三种数据,分别用选择三种数据,分别用surf、mesh、contour作图。作图。分析:首先应该有一个图形输出框,三个绘制不同图形的按纽。还分析:首先应该有一个图形输出框,三个绘制不同图形的按纽。还有一个选择控件,选择三种不同的数据。我们可以先作草图:有一个选择控件,选择三种不同的数据。我们可以先作草图:利用控件图标将需要的控件拉出利用控件图标将需要的控件拉出点击保存图标,我们点击保存图标,我们将保存一个将保存一个m文件和文件和一个同名的框架文件,一个同名的框架文件,扩展名为。扩展名为。figM文件已经将图形框的所有控件都显示出来了,但每个控件还不能文件已经将图形框的所有控件都显示出来了,但每个控件还不能相互调用,我们必须编制程序来激活它们。我们来看完整的文件:相互调用,我们必须编制程序来激活它们。我们来看完整的文件:function varargout=simple_gui(varargin)%SIMPLE_GUI Application M-file for simple_gui.fig%FIG=SIMPLE_GUI launch simple_gui GUI.%SIMPLE_GUI(callback_name,.)invoke the named callback.%Last Modified by GUIDE v2.0 27-Feb-2001 14:49:10if nargin=0%LAUNCH GUIfig=openfig(mfilename,reuse);%Use system color scheme for figure:set(fig,Color,get(0,defaultUicontrolBackgroundColor);%Generate a structure of handles to pass to callbacks,and store it.handles=guihandles(fig);guidata(fig,handles);%-%Call the popup menu callback to initialize the handles.data%field with the current value of the popupdata_popup_Callback(handles.data_popup,handles)%-if nargout 0varargout1=fig;endelseif ischar(varargin1)%INVOKE NAMED SUBFUNCTION OR CALLBACK tryif(nargout)varargout1:nargout=feval(varargin:);%FEVAL switchyardelsefeval(varargin:);%FEVAL switchyardendcatchdisp(lasterr);endEnd%-function varargout=surf_pushbutton_Callback(h,eventdata,handles,varargin)z=handles.data;surf(z);%-function varargout=mesh_pushbutton_Callback(h,eventdata,handles,varargin)z=handles.data;mesh(z)%-function varargout=contour_pushbutton_Callback(h,eventdata,handles,varargin)z=handles.data;contour(z)白色的程序为我们加白色的程序为我们加上的上的%-function varargout=data_popup_Callback(h,eventdata,handles,varargin)val=get(h,Value);switch valcase 1handles.data=peaks(35);case 2handles.data=membrane;case 3x,y=meshgrid(-8:.5:8);r=sqrt(x.2+y.2)+eps;z=sin(r)./r;handles.data=z;endguidata(h,handles)例:利用可视力化编程求大小写程序:例:利用可视力化编程求大小写程序:f=please input letterset(handles.h1_edit,string,f);%粉红色为加上的语句,而黄色为计算机自动生成的程序。粉红色为加上的语句,而黄色为计算机自动生成的程序。function varargout=h1_edit_Callback(h,eventdata,handles,varargin)%-function varargout=h2_edit_Callback(h,eventdata,handles,varargin)%-function varargout=upper_Callback(h,eventdata,handles,varargin)f=get(handles.h1_edit,string)g=upper(f)set(handles.h2_edit,str