Matlab交互式程序设计教程及举例Word文档格式.docx
《Matlab交互式程序设计教程及举例Word文档格式.docx》由会员分享,可在线阅读,更多相关《Matlab交互式程序设计教程及举例Word文档格式.docx(24页珍藏版)》请在冰豆网上搜索。
这些函数声明和参数在后续的程序设计中不要做任何修改,切记!
!
对我们目前的应用来说第一个函数和第三个函数的程序体也不要做任何修改。
根据自己的程序涉及需要只需修改第二个函数的程序体部分。
(具体的修改方式可以通过我的例子程序加以体会。
)
注意第二个函数程序体的最后一条语句
guidata(hObject,handles);
该语句在后续的程序设计中将会频繁使用,现在请先记住它。
5、祝贺你!
你现在已经有了一个名为“my1.m”和“my1.fig”的可以运行的文件了!
现在可以在matlab命令窗口中键入“my1”运行改程序,自然,除了显示一个标题为“my1”的空白窗口外,你还不能进行任何交互式控制操作(自然除了关闭该窗口外),因为你还没有写任何控制程序和添加任何控件。
二、增加控件及编写相应的执行程序
1、现在可以编辑运行窗口的标题栏——即将“my1”修改为自己希望的标题,本例中我改为“参数a,b,n对r=acos(nt+b)的影响”。
在GUI设计窗口中点击“
”工具条图标,弹出如下的“属性编辑框”
该窗口对于后续设计中的每个控件都可以打开(通过点击“
”工具条图标),它共有2列,左列是当前对象的用户可以修改的属性名(按首字母顺序排列),右列是每个属性的可以编辑的属性值,现在在左列找到“name”一项,将右侧的自动生成的“my1”改为“参数a,b,n对r=acos(nt+b)的影响”。
关闭此窗口,点击“
”以保存当前修改并运行程序。
OK!
窗口的标题栏已经变成了“参数a,b,n对r=acos(nt+b)的影响”。
2、现在开始程序的布局及控制设计,先从最简单的一个控制按钮开始。
拖动GUI设计窗口左侧的“PushButton”控件至右侧设计区域中的自己希望的位置,放开鼠标,然后可以点选并拖动该控件的右下角改变该控件的大小,则界面中的第一个控件就绪。
目前可以点击“
发生了什么事情?
运行窗口的响应位置处有了这个交互式控制按钮!
点击这个按钮,除了按钮自动界面上有个形象的动态响应外,不会有任何响应,因为目前我们还没有编写任何控制程序。
3、现在我们开始编写该控制程序。
点击“
”工具栏图标,打开m文件编辑器,浏览相应的文件,会发现文件末尾多了一个函数头:
functionpushbutton1_Callback(hObject,eventdata,handles)
这是系统自动生成的相应按钮控件的回调函数,系统自动将其命名为pushbutton1,其中pushbutton代表该控件的类别是“PushButton”,后面的阿拉伯数字代表这是用户在界面设计中所创建的第几个(该控件名称用户可以进行修改,具体修改方法见下一条说明)。
现在用户可以在该函数头下边填写相应的自己所希望的控制程序。
目前我们只希望用户点击按钮时进行一个简单的操作:
结束当前程序并关闭该窗口。
这只需如下的一条语句即可:
(将之写在该函数头的下面)
close;
保存修改后的m文件,回到GUI设计窗口,再次点击“
”运行程序,然后在运行后的窗口中点击该按钮。
哈哈!
如我所愿,程序安全退出了!
SoEasy!
!
4、下面我们可以调整该按钮的界面显示和将自动生成的“pushbutton1”名称改为自己容易记住的个性化名字。
在GUI设计窗口中点击此按钮,然后点击工具条上的“
”工具条图标,弹出相应的“属性编辑框”已调整它的名称和运行时的界面属性(任选)。
本例中我的调整如下:
(1)找到“tag”属性,将其后的“pushbutton1”改为“jieshu”;
(此时如果保存修改,然后进入相应的m文件编辑窗口,可以惊喜地看到其中的最后一个函数也进行了相应的修改:
(将函数头中的“pushbutton1”变成了“jieshu”)
functionjieshu_Callback(hObject,eventdata,handles)
%hObjecthandletojieshu(seeGCBO)
%eventdatareserved-tobedefinedinafutureversionofMATLAB
%handlesstructurewithhandlesanduserdata(seeGUIDATA)
(2)在属性编辑框中找到“String”一栏,将后面的内容改为“结束”;
找到“FontSize”,将后面的内容改为“20”;
找到“ForegroundColor”,点击左右两栏间的图标,弹出颜色选择窗口,点选自己喜欢的颜色;
找到“FontName”,将后续的内容改为“楷体”,找到“FontWeight”,点击后面的图标,在下拉菜单中选择“Bold”一项。
现在再运行程序,观察运行界面的变化,体会各个属性值和属性名的调整对按钮外观的影响。
5、现在在GUI设计窗口中再建立一个按钮,(界面的详细设计略),本例中我讲显示字符改为了“文档”,它的“Tag”改为了“help”.
进入m文件编辑器,发现最后又增加了一个函数:
functionhelp_Callback(hObject,eventdata,handles)
在该函数头下编写下列一条程序:
winopen('
code.pdf'
);
其功能是将程序控制权交给windows,由windows打开引号内所指定的一个当前路径下的文件,本例中我随便选了一个PDF文档,在程序执行时点击该按钮即可打开该文档。
大家最后上交的综合作业中的文档及使用说明帮助文件我希望大家以这样连接的方式可以让我顺利简单地打开。
6、继续界面的设计工作。
为了在程序的运行界面中显示图形,需要建立图形窗口,建立的过程很简单,同样是拖动GUI设计见面中左侧的“Axis”控件至右侧的界面布局窗口的自己希望的位置,然后用鼠标拖动方式调整其大小即可。
本例中我建立了两个图形窗口,其“Tag”名系统自动生成为“Axes1”和“Axes2”(用户也可同样通过属性编辑窗口修改为自己个性化的名称,本例中我没有做相应的修改)。
此外,我又建立了第三个控制按钮,其“Tag”属性改为了“jump”,“String”属性改为了“跳起来”,并进行了如下的布局。
可以在m文件中看到此时又多了一个新的函数文件头
functionjump_Callback(hObject,eventdata,handles)
该按钮的控制函数较为复杂,后续中我再详细说明,现在先不写任何程序。
7、在布局界面上再增加两个“slider”控件(滚动条),系统自动将其“Tag”命名为“slider1”和“slider2”,我在本例中依次用它们在程序运行时控制显示图像的函数中的“a”、“b”两个参数的调整,此时浏览一下m文件,可以看到自动为每个“Slider”增加了两个函数,分别如下:
functionslider1_Callback(hObject,eventdata,handles)
%hObjecthandletoslider1(seeGCBO)
%Hints:
get(hObject,'
Value'
)returnspositionofslider
%get(hObject,'
Min'
)andget(hObject,'
Max'
)todeterminerangeofslider
%---Executesduringobjectcreation,aftersettingallproperties.
functionslider1_CreateFcn(hObject,eventdata,handles)
%handlesempty-handlesnotcreateduntilafterallCreateFcnscalled
%Hint:
slidercontrolsusuallyhavealightgraybackground,change
%'
usewhitebg'
to0tousedefault.SeeISPCandCOMPUTER.
usewhitebg=1;
ifusewhitebg
set(hObject,'
BackgroundColor'
[.9.9.9]);
else
get(0,'
defaultUicontrolBackgroundColor'
));
end
%---Executesonslidermovement.
functionslider2_Callback(hObject,eventdata,handles)
%hObjecthandletoslider2(seeGCBO)
functionslider2_CreateFcn(hObject,eventdata,handles)
其中的两个_CreateFcn我们后续不需任何操作,所以也不需要任何修改,现在先记住我们需要对于两个_Callback函数进行程序的填写操作,以响应当程序执行时当用户拖动滚动条时应该引起何种响应,具体的响应程序也在后续填写,现在先在GUI界面中修改其属性值。
选中“Slider1”,打开相应的属性编辑器,找到其中的“Max”一栏,将后面的内容改为“8”(本例我的“a”值最大值为8),找到其中的“Min”一栏,将后面的内容改为“1”(本例我的“a”值最小值为1),找到“Value”一栏,点击后面的图标,在弹出的对话框中将“0.0”改为“5”,以指定在程序进行运行时将该滚动条的值设置为5。
此时可以运行程序,观察第一个滚动条中的滑块位置应该在中间偏右的位置,这说明上述设定已经成功。
“Slider2”我在这里先不做调整,系统自动默认最小值为0,最大值为1,当前值为0,逻辑上本例的“b”值应该在0与2π之间,作为示例,我在后续的程序书写中将获得的该滚动条上的当前值乘以2π来进行相应的调整。
作为示例,我对于本程序中参数n用一个“EditText”进行程序运行中的输入控制,所以在界面上再产生一个“EditText”,系统自动将其“Tag”设置为“edit1”,我对此不作修改,只是将其“FontSize”属性调整为“16”,将‘String’属性改为“1”。
此时检查m文件,可以观察到系统又自动创建了2个函数:
functionedit1_Callback(hObject,eventdata,handles)
functionedit1_CreateFcn(hObject,eventdata,handles)
同样其中的edit1_CreateFcn我们也不要进行任何改动,目前先记住日后在edit1_Callback中编写程序以响应用户在程序运行时响应的输入即可。
到此,本示例程序的控制对象和2个绘图区域已经完全建立完毕,目前我安排的界面如图所示。
8、下面再进行一些程序界面的辅助工作,用“StaticText”控件对界面增加一些说明,以增加界面的友好性。
在第一个图形窗口上方的空隙中放置一个“StaticText”,将“String”改为“参数a,b,n对r=acos(nt+b)的影响”,按自己的意愿设置好位置,颜色,字体大小,字体名称等属性值,具体设置详细大家可以通过属性编辑器窗口查看。
在两个滚动条和编辑框的左侧依次放置3个“StaticText”,分别用于说明后续的3个控件分别用于控制哪个参数,为此,将它们的“String”属性分别设置为“a”、“b”、“n”,大小和颜色等外观形象进行适当的调整。
在第一个滚动条下的左右两端各放置一个“StaticText”,分别用于说明该滚动条的最大值和最小值,为此将它们的“String”属性分别设置为“1”、“8”;
在第二个滚动条下的左右两端各放置一个“StaticText”,分别用于说明该滚动条的最大值和最小值,为此将它们的“String”属性分别设置为“0”、“2π”。
最后,在两个滚动条下方中部分别放置一个“StaticText”对象,分别用于实时显示对应的滚动条在程序运行时被用户拉动时当前的具体数值,所以其“String”属性值将来在程序中即时获取,因此在目前设计阶段不进行调整,但为了避免混淆,将二者的“Tag”属性分别修改为“texta”和“textb”以便于进行程序控制,具体实现方式参见后续程序的编写。
这样设计完成时得到的界面如下图。
三、完整程序的编写。
目前本例所希望的界面布局已经全部完成(除菜单外,此功能后续介绍),现在开始程序的编写工作,写具体的程序前,必须来了解matlab的各function(函数)间的数据传输机制。
我们先来考察一下已经完成的m文件,在目前系统自动生成的所有function中,除第一个(相当于C语言中的main函数)外,其它的所有函数的输入参数中都有一个名为handles的变量,这是matlab为GUI程序开发者提供的一个数据结构,用于各个函数之间的数据传输,handles是结构名,程序中的每个各function间的数据都必须以handles.***的形式存在,才能实现各协调工作的各函数之间的数据传输,目前当我们完成设计后,我们已经有了一批形如handles.***的变量,如在添加了第一个显示为“结束”的按钮并将其“Tag”属性值设置为“jieshu”后系统已经自动地为程序开发者创建了名为handles.jieshu的变量,如果我们在程序中希望访问这个按钮对象,我们就可通过这个handles.jieshu变量找到它,具体的访问程序编写后续写程序时不难学会。
接着我们创建“Tag”属性分别为“help”和“jump”第二个、第三个按钮时,系统马上为我们也创建了相应的两个变量handles.help和handles.jump。
接着我们建立两个图形窗口时,系统也依次建立了handles.axe1和handles.axes2两个变量用于程序中访问这两个图形窗口,在设置好两个滚动条后,系统也立即建立了handles.slider1和handles.slider2两个变量,然后再建立滚动条下面的编辑框时也建立了handles.edit1变量。
现在相信你明白“Tag”属性值的作用了吧?
该属性值是什么,系统就在其前加上handles.而产生可以访问该控件的一个变量,所以界面设计阶段如果自己想修改“Tag”属性值,必须保证和其它的不能相同,且符合matlab变量的命名规则——必须英文字母开头,由字母数字和下划线组成。
接着我们在界面上布置的每个“StaticText”(静态文本)都依次产生一个前缀为handels.的与相应的“Tag”属性一样的变量,本例程序中我们所设置的那些静态文本变量除最后2个外(即分别位于两个滚动条下方中间的文本框)都不需要进行控制,所以不用理睬它们,只需记住最后两个变量名分别是handles.texta和handles.textb,(它们的“Tag”属性在设计阶段我们分别已经改为了texta和textb。
除了上述的在界面设计阶段所自动建立的前缀为handles.的变量外,如果在每个函数中还需要创建新的变量,并希望这些变量值能为其它function共享,那么在定义新变量时一定也要建立形如handles.***的变量,如本例程序中我们要用到的handles.a,handles.b,handles.hh,handles.linewidth等。
明白了数据变量命名机制后,我们现在开始完善我们本例的程序编写。
1、填写系统已经生成的my1_OpeningFcn函数
在m文件中找到函数:
该函数名称“_”前的名字与创建GUI时保存的文件名相同,“_”后的“OpeningFcn”由系统自动生成,是固定不变的,开发者也不可进行修改,该函数用于执行用户所希望的程序运行时的matlab语句。
本例中我希望获取在设计阶段中两个滚动条中设置好的当前值作为函数r=acos(nt+b)中的a,b,n的值在左边大图像窗口中绘制该函数的图像,并作为花絮在第二个图像窗口中显示名为“dance_29.gif”的图像文件(该文件存放在当前目录下)。
目前的该函数文件系统已经自动生成了两条语句
%Choosedefaultcommandlineoutputformy1
handles.output=hObject;
%Updatehandlesstructure
不要修改它们,在两行语句之间插入自己的语句。
本例中我所键入的语句和简单功能说明如下:
handles.linewidth=2;
%定义画图的线宽
handles.color='
b'
;
%定义画图的颜色
handles.a=get(handles.slider1,'
value'
%获取第一个滚动条当前值,并将其赋给变量handles.a
%注意此句的语法,get(界面中的控件名称,’所希望获取的属性名’
%还记得吗?
我们在设计阶段该控件的’value’已经设置为5
%所以此句执行后handles.a=5
handles.b=2*pi*get(handles.slider2,'
%原理与语法上句相同,稍有差异的是我们在设计阶段此控件的最小值和最大值
%分别设置为0和1,即用户在拉动滚动条时此值介于0和1之间
%而我们希望该函数中b值的变化在0和2*pi之间,所以对获得的滚动条的值
%乘以2*pi以达到我们的要求,不过在设计阶段该值为0,所以此句执行后
%handles.b=0
handles.n=str2double(get(handles.edit1,'
string'
%原理和前句相同,获取handles.edit1的字符串内容,设计阶段设置为5
%但其数据类型为字符串,所以用str2double函数转化为浮点数赋值给handles.n
handles.t=linspace(0,2*pi,1000);
%对极坐标函数r=acos(nt+b)中的自变量t进行采点,0和2*pi之间等间距采
%1000个点(呵呵,数目显得比较多,辛苦计算机了)
r=handles.a*cos(handles.b+handles.n*handles.t);
%对函数r=acos(nt+b)由获取的常数a,b,n计算对应t的1000个点处的函数值
%注意此时的变量r我没有加前缀handles.,因为此变量仅仅在该函数内部使用
%不需要其它函数共享,所以我们可以不把它放在handles结构中
[x,y]=pol2cart(handles.t,r);
%本来可以直接用polar函数画该函数的图像,但实验一中的实验大家也看到了会
%出现极坐标网格线,我希望不要它们,所以用pol2cart将这组极坐标数据转化为直角
%坐标,后面用plot函数在直角坐标系下画出等效的图像
%