L/O/G/O1第3章MATLAB程序设计2——Matlab语言称为第四代编程语言,程序简洁、可读性很强而且调试十分容易,是Matlab的重要组成部分。3一、matlab的工作模式•命令行模式(指令驱动模式)命令行操作时,matlab窗口只允许一次执行一行上的一个或几个语句。•在matlab窗口输入数据和命令进行计算时,当处理复杂问题和大量数据时是不方便的。命令行方式程序可读性差,而且不能存储,对于复杂的问题,应编写成能存储的程序文件。4•m文件模式将matlab语句构成的程序存储成以m为扩展名的文件,然后再执行该程序文件,这种工作模式称为程序文件模式。程序文件不能在指令窗口下建立,因为指令窗口只允许一次执行一行上的一个或几个语句。5二、m文件的创建•m文件的类型是普通的文本文件,我们可以使用系统认可的文本文件编辑器来建立m文件。•具体的创建方法:1.在matlab命令窗口点击file菜单newm-file672.m文件m文件的语法类似于c语言,但又有其自身特点。m文件有两类独立的m文件—称命令文件可调用m文件—称函数文件(1).命令文件—独立的m文件命令文件实际上是一串指令的集合,与在命令窗口逐行执行文件中的所有指令,其结果是一样的。没有输入输出参数。8•命令文件包括两部分:注释文件和程序文件•%RANKNumberoflinearlyindependentrowsorcolumns.%K=RANK(X)isthenumberofsingularvaluesofX%thatarelargerthanMAX(SIZE(X))*NORM(X)*EPS.%K=RANK(X,tol)isthenumberofsingularvaluesofXthatarelargerthantol.%Copyright(c)1984-94byTheMathWorks,Inc.s=svd(x);if(nargin==1)tol=max(size(x))*max(s)*eps;endr=sum(stol);程序部分9(2)matlab内置函数文件matlab自定义的函数文件称内置函数文件调用内置函数的方法:使用函数名并给出相应的入口、出口参数即可。例如:sin.m函数。调用格式:y=sin(2*x)实际应用中:x=0:2*pi/180:2*pi;y=sin(2*x)plot(x,y)01234567-1-0.8-0.6-0.4-0.200.20.40.60.8110又如sqrt(x)——求x的平方根abs(x)——求x的绝对值det(a)——求行列式的值等等。matlab拥有大量的内置数学函数,供我们在数值运算和符号运算中调用。11(3)函数m文件—需要输入变量,返回输出变量matlab用户可以根据需要编辑自己的m文件,它们可以像库函数一样方便的调用,从而极大地扩展了matlab的能力。12函数m文件的格式:function返回变量=函数名(输入变量)注释说明语句段程序语句段特定规则:1.函数m文件第一行必须以单词function作为引导词,必须遵循如下形式:function因变量=函数名(自变量)2.m文件的文件名必须是函数名.m。3.程序中的变量均为局部变量,不保存在工作空间中。其变量只在函数运行期间有效。131.匿名函数函数是指具有输入和输出的语句体.匿名函数能创建由表达式定义的简单函数.在一段程序中,后定义的匿名函数可以调用已定义过的匿名函数.格式:fhandle=@(arglist)exprexpr指用来定义函数的表达式,相当于函数体;圆括号内的arglist是以逗号分隔的输入变量名列表;“@”创建函数句柄,用来调用函数;“=”是赋值号;fhandle是保存函数句柄的变量名,调用它,就可以调用它保存的函数.141.匿名函数例1.3.9创建函数321()(ee)axaxfxa([0,24]x)的匿名函数,并当1a=110,2a=−0.2,3a=−2时,分别计算x取值为0、2、4、6和8时对应的函数值.f=@(a,x)a(1).*(exp(a(2).*x)-exp(a(3).*x));y=f([110,-.2,-2],0:2:8)y=071.7249.38933.13122.20915MATLAB程序结构•按照程序设计的观点,任何算法功能都可以通过由程序模块组成的三种基本程序结构的组合来实现:–顺序结构:程序按程序语句或模块在执行流中的顺序逐个执行。–选择结构:程序按设定的条件实现程序执行流的多路分支。–循环结构:程序按给定的条件重复地执行指定的程序段或模块。161顺序结构程序模块1程序模块2•MATLAB中实现顺序结构的方法非常简单:–只需将程序语句顺序排列即可172选择结构•在MATLAB中,选择结构由两种语句结构实现:–if语句–switch语句条件程序模块1成立不成立程序模块218if语句if表达式程序模块1else程序模块2end19if语句的两种变形•(1)单分支if语句:只有一个分支的选择结构if表达式程序模块end•(2)多分支if语句:超过2个的选择if表达式1程序模块1elseif表达式2程序模块2…elseif表达式n程序模块nelse程序模块n+1end20例:将百分制的学生成绩转换为五级制的成绩输出clearn=input('输入n=');ifn=90r='A'elseifn=80r='B'elseifn=70r='C'elseifn=60r='D'elser='E'end运行结果:输入n=87r=B21•在条件表达式中,通常都是由关系操作符,,=,=,==,~=等逻辑操作符&,|,~等逻辑函数:isequal——若是相等则为真isempty——若是空矩阵则为真isstr——若是字符串则为真例:编写m函数,计算函数值x(x1)2x-1(1x10)3x-11(x=10)222.switch语句switch表达式case数值1程序模块1;case数值2程序模块2;……otherwise程序模块n……end23例:将百分制的学生成绩转换为五级制的成绩输出-使用switch语句clearn=input('输入n=');switchfix(n/10)case{10,9}r='A'case8r='B'case7r='C'case6r='D'otherwiser='E'end运行结果:输入n=65r=D243.2.3循环结构•在MATLAB中,循环结构可以由两种语句结构实现:–for语句循环结构–while语句循环结构程序模块不成立成立条件251.for语句循环结构for循环变量=起始值:步长:终止值循环体end26例:使用for结构计算1+2+3+…+100clearsum=0;fori=1:100sum=sum+i;endsum运行结果:sum=505027•有一周期为4的正弦波上叠加了方差为0.1的正态分布的随机噪声的信号,用循环结构编制一个三点线性滑动平均的程序。(提示:①用0.1*randn(1,n)产生方差为0.1的正态分布的随机噪声;②三点线性滑动平均就是依次取每三个相邻数的平均值作为新的数据,如x1(2)=(x(1)+x(2)+x(3))/3,x1(3)=(x(2)+x(3)+x(4))/3……)282.while语句循环结构while表达式循环体end29例:使用while结构计算1+2+3+…+100clearsum=0;i=0;whilei100i=i+1;sum=sum+i;endsum运行结果:sum=505030牛刀小试•编制一个解数论问题的函数文件:取任意整数,若是偶数,则用2除,否则乘3加1,重复此过程,直到整数变为1。31•echo指令—用来控制m文件在执行过程中是否显示echoon—打开所有命令文件的显示方式echooff—关闭所有命令文件的显示方式echo—在以上两者间切换32•input——提示用户从键盘输入数值、字符串、表达式。例:n=input('Howmanyapples=')Howmanyapples=5n=5•pause——暂停,等待用户响应可令m文件执行暂停,并在继续执行前按任一个键。33•keyboard——与input类似,功能更强keyboard调用键盘与调用m文件一样,当keyboard在m文件中出现时,它停止文件的执行并控制键盘,用于修改程序。•break——中断break中断for,while循环语句的执行,在嵌套循环结构中,break进从最里层循环推出。34代码运行的计时方法•整段代码的计时tic…toc表示计算tic到toc之间的时间。•例如:tica=rand(300);%随机生成300x300的矩阵inv(a);%求逆矩阵toc35•etime(t1,t2)来计算t1,t2之间的时间差来完成计时,其中时差=t1-t2。•例如:t0=clocka=rand(300);inv(a);elapsed_time=etime(clock,t0)%elapsed_time指流逝过的时间•同理可以使用cputime来计时t=cputime;your_operation;cputime-t36七、程序代码优化1.尽量不要使用循环,而使用矩阵结构来进行运算。例:t0=cputimen=100000;sum=0;fori=1:nsum=sum+1/iendsumt1=cputime-t037•而如果使用向量、矩阵和系统内部函数ticn=100000;a=1:n;total=cumsum(1./a)toc%cumsum函数实现累计求和38八、文件操作matlab文件输入、输出(I/O)函数允许把其它格式的数据文件直接读进matlab,它是以c语言文件I/O函数为基础的。文件数据格式有两种形式,一是二进制文件,二是文本文件。在打开文件时需要进一步指定文件格式类型,即指定是二进制文件还是文本文件。391.打开和关闭文件(fopen,fclose)格式:fid=fopen('数据文件名','打开方式')'r'——表示对打开的文件读数据'w'——表示对打开的文件写数据'a'——表示在打开的文件末尾添加数据fid用于存储文件句柄值,句柄值用来标识该数据文件,其他函数可以利用它对该数据文件进行操作。40•文件一旦打开,即可进行读写操作,操作完后应及时关闭,使用fclose函数。sta=fclose(fid)——关闭上述打开文件该函数关闭fid所表示的文件。sta表示关闭文件操作的返回代码,若关闭成功,返回0,否则返回–1。sta=fclose(all)——关闭所有打开的文件412.读写二进制数据文件fread,fwrite——可读写数据文件,文本文件。例:fid=fopen(‘user.dat’,’r’)a=fread(fid,50)sta=fclose(fid)其中fread的调用格式为:[A,COUNT]=fread(fid,size,precision)其中A用于存放读取的数据,COUNT返回所读取的数据元素个数,fid为文件句柄,size为可选项,若不选用则读取整个文件内容,若选用则它的值可以是下列值:fread(list,sizeof(char),25,file);42(1)N表示读取N个元素到一个列向量。(2)Inf表示读取整个文件。(3)[M,N]表示读数据到M×N的矩阵中,数据按列存放。precision代表读写数据的类型2.写二进制文件fwrite函数按照指定的数据类型将矩阵中的元素写入到文件中。其调用格式为:COUNT=fwrite(fid,A,precision)其中COUNT返回所写的数据元素个数,fid为文件句柄,A用来存放写入文件的数据,precision用于控制所写数据的类型,其形式与fread函数相同。43•例:建立一数据文件magic5.dat,用于存放5阶魔方阵。•程序如下:fid=fopen(‘magic5.dat’,‘w’);cnt=fwrite(fid,magic(