1、matlab程序设计基础程序设计基础 HaiNan University2 HaiNan University3 HaiNan University4 HaiNan University5和其他语言一样,和其他语言一样,MATLAB的程序结构也不外三种:顺序结构、分支结构和循环结构。的程序结构也不外三种:顺序结构、分支结构和循环结构。5、程序结构和流程控制、程序结构和流程控制5.1 顺序结构顺序结构顺序结构即指顺序往下执行的程序语句结构,其实也就是一组复合的表达式。在顺序结构即指顺序往下执行的程序语句结构,其实也就是一组复合的表达式。在MATLAB中,表达式之间可以用分号、逗号或换行来分隔。如
2、前例的函数文件中,表达式之间可以用分号、逗号或换行来分隔。如前例的函数文件summ.m和命令文件和命令文件use.m均为均为顺序结构。顺序结构。5.2 分支结构分支结构1、MATLAB的分支结构的分支结构 HaiNan University62、分支结构的语句形式及实例、分支结构的语句形式及实例分支结构就是由逻辑判断决定程序执行流转方向的一种结构。现有分支结构就是由逻辑判断决定程序执行流转方向的一种结构。现有if.else.end和和switch.case.end两种形式。两种形式。第一类分支结构采用的语句形式有第一类分支结构采用的语句形式有3种:种:if 表达式表达式 语句组语句组1endi
3、f 表达式表达式 语句组语句组1else 语句组语句组2endif 表达式表达式 A 语句组语句组1elseif 表达式表达式B 语句组语句组2 else 语句组语句组3end注意:除直接应用上述三种形式外,第注意:除直接应用上述三种形式外,第3 3种结构可扩展,种结构可扩展,if 还可以嵌套。还可以嵌套。HaiNan University7举例:举例:例例5.1 输入数输入数n,判断其奇偶性。,判断其奇偶性。程序式书写法:程序式书写法:*n=input(n=);if rem(n,2)=0 A=even else A=odd end 更完善的程序式书写法:更完善的程序式书写法:n=input(
4、n=);if isempty(n)=1 A=empty elseif rem(n,2)=0 A=even else A=odd end命令行书写法:命令行书写法:n=input(n=);if isempty(n)=1 A=empty,elseif rem(n,2)=0;A=even,else,A=odd,end HaiNan University8例例5.2 写程序,判断某一年是否闰年写程序,判断某一年是否闰年*。C语言程序:语言程序:main()int year,leap;scanf(“%d”,&year);if(year%4=0)if(year%100=0)if(year%400=0)le
5、ap=1;else leap=0;else leap=1;else leap=0;if(leap)printf(“%d is”,year);else printf(“%d is not”,year);printf(“a leap year.n”);MATLAB程序:程序:year=input(year=);if rem(year,4)=0 if rem(year,100)=0 if rem(year,400)=0 leap=1;else leap=0;end else leap=1;endelse leap=0;endif leap display(is a leap year)else di
6、splay(is not a leap year)end HaiNan University9switch 表达式表达式case 值值1语句组语句组1case 值值2语句组语句组2otherwise 语句组语句组n第二类分支结构采用的语句形式如下:第二类分支结构采用的语句形式如下:注意:注意:switch后的表达式的结果值,通常为标量或字符串。后的表达式的结果值,通常为标量或字符串。HaiNan University10举例:举例:例例5.3 用用switch语句改写例语句改写例3.1。程序式书写法:程序式书写法:n=input(n=);switch mod(n,2)*case 1 A=奇奇
7、case 0 A=偶偶 otherwise A=空空 end HaiNan University11例例5.4 给出一百分制成绩,要求输出成绩等级给出一百分制成绩,要求输出成绩等级A、B、C、D、E。90分以上为分以上为A,8089分为分为B,7079分为分为C,6069分为分为D,60分以下为分以下为E。C语言程序:语言程序:main()int score,g;scanf(“%d”,&score);g=score/10;switch(g)case 10:case 9:printf(“An”);break;case 8:printf(“Bn”);break;case 7:printf(“Cn”
8、);break;case 6:printf(“Dn”);break;default:printf(“En”);MATLAB程序:程序:score=input(score=);g=round(score/10-0.5);if g=10 display(A)else switch g case 9,display(A)case 8,display(B)case 7,display(C)case 6,display(D)otherwise display(E)endend HaiNan University121、MATLAB的循环结构的循环结构 循环结构就是执行重复运算的一段程序。循环结构就是执行
9、重复运算的一段程序。MATLAB的循环语句有的循环语句有for.end和和while.end两种形两种形式。式。2、循环结构的语句形式及实例、循环结构的语句形式及实例5.3 循环结构循环结构For循环结构的语句形式:循环结构的语句形式:for 变量变量=初值初值:增量增量:终值终值 语句组语句组end 注意:注意:for 还可以嵌套。还可以嵌套。HaiNan University13举例:举例:例例5.5 列出构成列出构成Hilbert矩阵的程序。矩阵的程序。clear,close all format rat,n=input(n=),for i=1:n for j=1:n h(i,j)=1/
10、(i+j-1);end end h HaiNan University14例例5.6 求求100200间的全部素数间的全部素数*。C语言程序:语言程序:#includemain()int m,k,i,n=0;for(m=101;m=200;m=m+2)k=sqrt(m+1);for(i=2;i=k+1)printf(“%d”,m);n=n+1;MATLAB程序:程序:n=0;x=1:21;for m=101:2:200 k=round(sqrt(m+1)-0.5);for i=2:k if rem(m,i)=0 break,end j=i+1;if j=k+1 n=n+1;x(n)=m;end
11、 endendx HaiNan University15While循环结构的语句形式:循环结构的语句形式:while 表达式表达式 语句组语句组end注意:注意:while 语句中的表达式通常为关系表达式或逻辑表达式。语句中的表达式通常为关系表达式或逻辑表达式。举例:举例:例例5.7 求如下级数的和:求如下级数的和:1+1/2+1/3+1/4+1/100。s=0;n=1;while n=100 s=s+1/n;n=n+1;end,s HaiNan University16例例5.8 用用/41-1/3+1/5-1/7+公式求公式求的近似值,直到最后一项的绝对值小于的近似值,直到最后一项的绝对值
12、小于10-6为止。为止。C语言程序:语言程序:#include main()int s;float n,t,pi;t=1,pi=0;n=1.0;s=1;while(fabs(t)1e-6)pi=pi+t;n=n+2;s=-s;t=s/n;pi=pi*4;printf(“pi=%10.6fn”,pi);MATLAB程序:程序:t=1;pi=0;n=1;s=1;while abs(t)1e-6 pi=pi+t;n=n+2;s=-s;t=s/n;endpi=4*pi HaiNan University17匿名函数可以接受多个输入输出参数。创建匿名函数的格式:fhandle=(arglist)expr
13、其中:“expr”通常是一个简单的MATLAB变量表达式,实现函数的功能;“arglist”是参数列表;“”是MATLAB中创建函数句柄的操作符.匿名函数实例:myfhd1=(x)(x+x.2)myfhd1(2)ans=6myfhd2=(x,y)(sin(x)+cos(y)myfhd2(pi/2,pi/6)ans=1.8660每一个M文件第一行定义的文件就是M文件主函数,一个M文件只能包含一个主函数,通常将M文件名和M文件主函数名设为一致。在一个函数内部可以定义一个或多个函数,这种定义在其他函数内部的函数被成为嵌套函数。嵌套函数的书写语法格式如下:function x=A(p1,p2)func
14、tion y=B(p3)endend嵌套函数的互相调用需要注意和嵌套的层次密切相关,例:function A(x,y)%外层函数A(例如主函数)B(x,y);D(y);function B(x,y)%A的嵌套函数(B的父函数为A)C(x);D(y);function C(x)%B的嵌套函数(C的父函数为B)D(x);end end HaiNan University18 HaiNan University19 HaiNan University20 HaiNan University21 HaiNan University22 HaiNan University23 HaiNan Univer
15、sity24 HaiNan University25 HaiNan University26 HaiNan University27 HaiNan University28 HaiNan University29 HaiNan University30 HaiNan University31 HaiNan University32 HaiNan University33 HaiNan University34 HaiNan University35 HaiNan University36 HaiNan University37 HaiNan University38 HaiNan Univer
16、sity39 HaiNan University40 HaiNan University41实例1 matlab神经网络工具箱 HaiNan University421.1 网络数据对象的建立net=newff(xm,xM,h1,hk,f1,fk);xm,xM分别为列向量(行数为变量个数),分别存储每个变量的最小值和最大值。h1,hk表示网络各层的节点数,一共有k层.f1,fk表示各层使用的传输函数,默认为tansig,即Sigmoid函数。还可使用函数purelin,即f(x)=x。其它可看matlab帮助:help newff HaiNan University431.2 网络数据对象ne
17、t的属性net.IW:来自输入层的加权矩阵。BP网络只用net.IW1,表示各个输入变量对第1层各节点的加权矩阵。net.LW:来自中间层的加权向量。BP网络用net.IW2,1表示第1隐层个节点向下一层个节点的加权矩阵;net.IW3,2表示第2隐层向下一层的加权矩阵net.b:各层的偏移。Net.b1表示第1隐层个节点的偏移 HaiNan University44net.trainParam.epochs:最大训练步数。不过当误差准则满足时,即使没达到此步数也停止训练。缺省为100。net.trainParam.goad:网络误差准则,当误差小于此准则时停止训练,缺省为0。net.trai
18、nFcn:训练算法。缺省为 trainlm,即Levenberg-Marquardt算法。还可使用traingdx,即带动量的梯度下降算法;traincgf,即共轭梯度法。其它可看matlab帮助:help-contents-Neural Network Toobox-Network Object Reference;help(net.trainFcn)HaiNan University451.3 网络的训练net,tr,Y1,E=train(net,X,Y);net是函数newff建立的数据对象。X为n*m的矩阵,n为输入变量个数,m为样本数(即把每个样本是一个列向量)。Y为k*m的矩阵,k
19、为数出变量个数。tr返回训练的跟踪信息,tr.epochs为训练步数,tr.perf为各步目标函数的值。Y1和E返回网络最终的输出和误差。训练结束后可以用plotperf(tr)来绘制目标值随着训练步数变化的曲线。HaiNan University461.4 网络的泛化(预测)Y=sim(net,X);net是函数newff建立的数据对象。X为n*m的矩阵,n为输入变量个数,m为样本数(即把每个样本是一个行向量)。Y为k*m的矩阵,k为数出变量个数。HaiNan University472 例子:神经网络函数拟合(预测)试构造合适的神经网络模型拟合如下数据点,并预测x=10的值:x00.511
20、.522.533.544.5y00.430.690.740.610.360.08-0.17-0.34-0.4x55.566.577.588.599.5y-0.35-0.23-0.080.060.160.210.20.150.07-0.01 HaiNan University48matlab代码x=0:0.5:9.5;y=0,0.43,0.69,0.74,0.61,0.36,0.08,-0.17,-0.34,-0.4,-0.35,-0.23,-0.08,0.06,0.16,0.21,0.2,0.15,0.07;net=newff(0,9.5,5,1);net.trainParam.epochs=100;net.trainParam.goad=0.000001;net=train(net,x,y);x1=0:0.1:10;y1=sim(net,x1);figure;plot(x,y,.);hold on;plot(x1,y1,r);HaiNan University49 HaiNan University50谢谢!