版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第4章 Matlab编程基础,4.1 M文件基础 4.2 变量和语句 4.3 程 序 调 试 4.4 高级数据结构 4.5 程序设计注意事项 习 题,4.1 M文件基础,4.1.1 函数 4.1.2 脚本 4.1.3 伪代码,M文件包括:函数(Functions)和脚本(Scripts)两种。 M文件的查看,可通过type命令; M文件的打开,可通过【File】|【Open】菜单进入文件选择的目录界面; M文件的创建和编辑,可以在任意的文本编辑器中进行,但推荐和默认使用MATLAB自带的文本编辑器和Notebook; M文件的创建和编辑,可通过【File】|【New】|【M-File】菜单进入
2、文本编辑器界面,脚本与函数的区分,脚本文件(Scripts) 没有关键词 不接收输入变量,不返回输出变量 在工作空间上进行数据存储和操作 文件名没有特殊限制 函数文件(Functions) 有关键词 function 接受输入变量,返回输出变量 普通变量仅在本函数内部有效 文件名与函数文件名要尽量相同,4,4.1.1 函数,MATLAB中许多M文件格式的函数。 函数被调用时,通过获取外部参数进行运算,并向外部返回运算结果; 函数内部的变量都是隐含的,存放在函数本身的工作空间内,函数的例子-rank,function r = rank(A,tol) %RANK Matrix rank. % RA
3、NK(A) provides an estimate of the number of linearly % independent rows or columns of a matrix A. % RANK(A,tol) is the number of singular values of A % that are larger than tol. % RANK(A) uses the default tol = max(size(A) * eps(norm(A). % Class support for input A: % float: double, single % Copyrig
4、ht 1984-2007 The MathWorks, Inc. % $Revision: 5.11.4.5 $ $Date: 2007/08/03 21:26:23 $ s = svd(A); if nargin=1 tol = max(size(A) * eps(max(s); end r = sum(s tol,函数句柄,函数句柄,可以理解成一个函数的代号,这样在调用时可以调用函数句柄而不用调用该函数。 语法: 变量名= 函数名 的作用就是将一个函数的函数句柄赋值给等号左边的变量。在调用函数时就可以调用该句柄,实现调用函数的功能,匿名函数(Anonymous Functions,匿名函数
5、是函数句柄的一种特殊用法,函数句柄变量不指向特定的函数,而是指向一个函数表达式。 语法结构: f = (arglist)expression 例: sqr = (x) x.2; sqr(7) ans = 49,内联函数(Inline Functions,内联函数跟匿名函数比较类似,可以通过一个函数表达式近而得到该函数。 语法格式: 1 变量名=inline(函数表达式); 2 变量名=inline(函数表达式, 变量名1,变量名2, . ,变量名n); 例: f=inline(x+y); f=inline(x+y,x,y); f(3,5) f(3,5) ans = ans = 8 8,三种函数
6、定义方式的比较,函数句柄: 变量名= 函数名 f1=sin 匿名函数 f = (arglist)expression f2=(x)sin(x) 内联函数 变量名=inline(函数表达式, 变量名1,变量名2, . ,变量名n); f3=inline(sin(x),x,主函数与子函数(Primary and Subfunctions,M文件可以包含多个函数,其中,只有一个是主函数,其他都是子函数。 主函数和子函数必须在M文件内定义,主函数必须出现在最上方,也就是每个M文件的第1个文件为主函数,子函数位于主函数的后面,其个数不限,次序不限。 主函数和各子函数的工作空间彼此独立。 主函数的作用域大
7、于子函数;主函数可以由M文件外(命令行和其它M文件)调用或执行,而子函数只能在本M文件内被调用,私有函数( Private Functions,放在特定的子文件夹private中的函数。 只对包含子文件夹private目录下的函数可见,只能被这些函数调用。 在不同目录下的子文件夹private中可以用相同的文件,2021年3月6日星期六,12,当M文件中需要调用某一个函数时,MATLAB按照以下顺序进行搜索: 检查此函数是否是子函数; 检查此函数是否为私有目录的函数; 从所设定的搜寻路径搜索此函数。 搜索过程中,只要找到与第一个文件名相符的函数就会立即取用而停止搜索,注 意,嵌套函数( Nes
8、ted Functions,定义在函数内的函数。 更容易共享数据,减少函数之间的参数传递。 主调函数和被调函数结束时候必须都加end,例:function yint=intnest(a,b,c) yint=quad(poly2, 0,1); function y=poly2(x) a,b,c y=a.*x.2+b.*x+c; end end,Matlab支持多重嵌套,当包含嵌套函数时,该文件内的所有函数(主函数和子函数),不论是否包含嵌套函数都需显式end结束。 嵌套函数的调用规则: (1)直接父级函数可调用下一层嵌套函数;父-子 (2)相同父级的同级嵌套函数可相互调用;兄弟 (3)处于低层的
9、嵌套函数可调用任意父级函数。子-父、叔、伯,下列情况下可以调用: 父级可调用直接的下一级(比如A能调用B和D,不能调用C和E); 相同父级的同级可互相调用(比如B能调用D,D能调用B) ; 低层的函数可调用任意父级(比如C可以调用B或D,但不能调用E,function A(x, y) % Primary function B(x, y); D(y); % Not C or E function B(x, y) % in A C(x); D(y); function C(x) % in B B(x, y); D(x); % Not E end end function D(x) % in A B
10、(x,y); E(x); function E(x) % in D . end end end,嵌套函数的变量访问规则: (1) 嵌套函数(子/孙)可访问包含它的外部函数(父)的局部变量 (2) 外部函数(父)可访问它所包含的嵌套函数(子/孙)的局部变量 (3) 在嵌套函数内部定义,未在外部函数定义或使用的局部变量,同一父级的嵌套函数不能互相访问,3) 在嵌套函数内部定义,未在外部函数定义或使用的局部变量,同一父级的嵌套函数(兄/弟)不能互相访问,nestfun2函数不能访问nestfun1中的x变量,4.1.2 脚本,脚本文件类似于DOS下的批处理文件,可包含MATLAB的各种命令,在命令窗
11、口中键入此文件的文件名后,MATLAB逐一顺序执行文件内的所有命令。 脚本文件的运行:将脚本所在目录设置为当前工作目录,(1)在命令窗口中键入此文件的文件名后,回车;(2)在文本编辑器中打开脚本后,单击【Debug】菜单下的【Run】或快捷键F5或工具条上的图标。 脚本运行过程所产生的变量都是全局变量,都驻留在MATLAB工作空间内,对函数和脚本进行总结: (1) 函数名必须与文件名相同。 (2) 脚本没有输入参数和返回值;函数可以包括零个或多个输入参数和返回值。 (3)函数被调用时,MATLAB会为它开辟一函数工作空间(临时的),用来存放中间变量,当执行完函数文件的最后一条命令或者遇到ret
12、urn命令时就将临时工作空间清空,4)函数中的变量(除特殊声明外)都是局部变量,而脚本中的变量都是全局变量。 (5)函数和脚本文件可以互相调用,在函数中调用脚本文件,等价于在函数中将脚本文件的内容粘贴在调用的位置,4.1.4 伪代码,M文件首次被调用时,MATLAB将对该M文件进行语法分析,并把生成的相应伪代码(P码)存放在内存中。此后当再次调用该M文件时,将直接运行该文件在内存中的伪代码。 伪代码文件和原码文件具有相同的文件名,但其扩展名为.p。 伪代码文件不是只有当M文件被调用时才产生,也可使用pcode命令预先生成,4.2 变量和语句,4.2.1 变量类型 4.2.2 程序控制结构,4.
13、2.1 变量类型,MATLAB中的变量不需要事先定义。 在MATLAB中,变量名必须以字母开头,之后可以是任意字母、数字或下划线,但之间不能有空格; 区分大小写; 最大长度为63,第63个字符之后的部分将被忽略,除了上述命名规则外,MATLAB还提供一些特殊的变量,如下表所示,除命名规则外,变量命名时还需要注意: (1) 变量名不能与已有函数名相同,否则在内存中有该变量时将不能调用同名函数; (2) 变量名不能与MATLAB预留的关键字和特殊变量名相同,否则系统会显示错误信息,变量按照作用范围分为局部变量和全局变量。 在MATLAB中使用命令global声明全局变量, 需要使用全局变量的M文件
14、,都必须在各自的代码中声明此全局变量。 清除全局变量用命令:clear global 察看全局变量用命令:whos global,在使用全局变量中应该注意: 在使用之前必须预先声明,建议将声明放在函数体的首行位置; 虽然对全局变量的名称并没有特别的限制,但是为了提高程序的可读性,建议采用大写字符命名全局变量; 全局变量会损坏函数的独立性,使程序的书写和维护变得困难,尤其是在大型程序中,不利于模块化,尽量少用,function out=myfun(y) global X out=X+y,global X X=3,例子,myfun(5) ans = 8 clear myfun(5) ans = 8
15、 whos global clear global whos global myfun(5,4.2.2 程序控制结构,1顺序结构 2循环结构 3选择结构(条件结构) 4其他控制结构,对于实现任何功能的程序,均可由顺序、循环和选择3种基本结构组合实现。 为了更方便地设计程序,还需要一些特殊的控制结构,如跳出循环结构,1.顺序结构,由前至后依次执行程序的各条代码,直至最后一条代码 脚本文件就是典型的顺序结构,Matlab技术文档里面的演示程序段,X,Y,Z = peaks(30); surfc(X,Y,Z) colormap hsv axis(-3 3 -3 3 -10 5,2循环结构,按照给定的
16、条件,重复执行指定的代码 该结构一般用于有规律的重复运算 在MATLAB中包括for循环和while循环。 两者之间的最大不同在于代码的重复是如何控制的。在while 循环中,代码的重复的次数是不能确定的,只要满足用户定义的条件,重复就进行下去;在for循环中,代码的重复次数是确定的,1)for循环,for语句的一般格式为: for 循环变量=表达式1:表达式2:表达式3 循环体语句 end 表达式1的值为循环变量的初值,表达式2的值为步长,表达式3的值为循环变量的终值。步长为1时,表达式2可以省略,for n=3:30 r(n) = rank(magic(n); end,M=100; N=1
17、00; for i=1:M for j = 1:N H(i,j) = 1/(i+j); end end,for语句还有一种格式: for 循环变量=矩阵表达式 循环体语句 end 依次将矩阵的各列元素赋给循环变量,然后执行循环体语句,直至各列元素处理完毕,s=0; a=12,13,14;15,16,17;18,19,20;21,22,23; for k=a s=s+k; end disp(s,采用循环语句会降低执行速度,所以尽量多用向量操作,少用循环语句,在无可避免的情况下,让循环体执行尽量少的工作量,n=10000; i=1:2:2*n-1; y=sum(1./i.2); y,n=10000
18、; y=0; for i=1:2:2*n-1 y=y+1/i2; end y,2)while循环,while语句的一般格式为: while (条件) 循环体语句 end 其执行过程为:若条件成立,则执行循环体语句,执行后再判断条件是否成立,直到不成立时跳出循环,因此可能会陷入死循环,a = 0; fa = -5; b = 3; fb = 16; while b-a eps*b x = (a+b)/2; fx = x3-2*x-5; if fx0 b = x; else a = x; end end x,例子: 求 x3-2*x-5=0在0,3的解,3选择结构,根据给定的条件来执行不同的代码。
19、在MATLAB中有if-else-end 和 switch-case-otherwise两种结构,1)if-else-end结构,语法: if 表达式 语句 end,if 表达式1 语句1 elseif 表达式2 语句2 else 语句3 end,if y = 1 z = sin(x); elseif y = 2 z = cos(x); else z = cos(x).*sin(x); end,2)switch-case-otherwise结构,语法: switch 开关表达式 case 分支表达式1 语句1 case 分支表达式2 语句2 . otherwise 语句1 end,year=i
20、nput(year:) month=input(month:); switch month case 2 if rem(year,4)=0 days=29, else days=28,end case 4, days=30 case 6, days=30 case 9, days=30 case 11, days=30 otherwise, days=31 end,4其他控制结构,在程序设计中经常遇到提前终止循环、跳出子程序、显示出错信息等情况,主要有continue、break、return、try . catch等,结束本次循环,即跳过循环体中尚未执行的代码,接着判断是否进行下一次循环,继
21、续下一个循环,N=1000; for i=1:N x=rem(i,4); if x=0 continue end i x end,1)continue,终止本次循环,跳出所在层循环,2)break,N=1000; for i=1:N x=rem(i,4); if x=0 break end i x end,a = 0; fa = -5; b = 3; fb = 16; while b-a eps*b x = (a+b)/2; fx = x3-2*x-5; if fx = 0 break elseif fx0 b = x; else a = x; end end,a = 0; fa = -5;
22、b = 3; fb = 16; while b-a eps*b x = (a+b)/2; fx = x3-2*x-5; if fx0 b = x; else a = x; end end,3)return,break使正在运行的函数正常退出,并返回调用它的代码段继续运行,return强制结束该函数的执行,N=1000; for i=1:N x=rem(i,4); if x=0 break end i x end a=10,N=1000; for i=1:N x=rem(i,4); if x=0 return end i x end a=10,4)trycatch,错误控制语句 在出现错误之前执
23、行catch前面的语句,出现错误后执行catch后面的语句。 语法结构 try 尝试执行的语句块catch 出错后执行的语句块end,5)input,用于程序执行过程中要求用户向程序中输入数据。 用法: 变量名=input(提示信息字符串) 执行到这个命令时, Matlab的命令窗口中将显示提示信息字符串, 此时用户可以输入数据, 这个数据将被赋值给此语句中指定的变量名。 例: mydata=input(请输入mydata这个变量的值:,6)keyboard,将停止文件的执行并将控制权交给键盘,此时命令窗口的提示符由“”变成“K”,当输入return后,控制权将交回文件。 对程序的调试和在程序
24、运行中修改变量值都很方便,7)pause,暂时中止程序的运行,该命令对程序的调试和查询中间变量值时很方便。 语法: pause(n) 暂停n秒钟, 一般情况下可以精确到0.01秒,8)error,终止程序运行并给出出错信息; 语法:error(出错信息) 利用另外一个命令lasterr可以得到上一次出错的信息,9)warning,给出警告信息, 程序继续运行; 语法: warning(警告信息) 利用另外一个命令 lastwarn得到上一次警告信息,4.3 程 序 调 试,4.3.1 直接调试法 4.3.2 工具调试法,4.3.1 直接调试法,对于简单的程序往往采用直接调试法: (1)通过分析
25、后,将重点怀疑语句后的分号删掉,将结果显示出来,然后与预期值进行比较; (2)单独调试函数时,将函数声明行注释掉,并定义输入变量的值,然后以脚本方式运行,这样可保存中间变量,进而进行分析和找出错误; (3)在程序中的适当位置添加输出变量值的代码; (4)在程序中的适当位置添加keyboard命令,4.3.2 工具调试法,1以命令行为主的程序调试 2以图形界面为主的程序调试,MATLAB调试程序的工具器(Debugger),对于复杂的程序,利用这些工具可以提高编程的效率,包括命令行的调试函数和图形界面的菜单命令,1以命令行为主的程序调试,以命令行为主的程序调试手段具有通用性,可以适用于各种平台,
26、它主要是应用MATLAB提供的调试命令。 在命令窗口输入help debug可以看到对于这些命令的简单描述,1)设置断点,断点,程序运行到有断点的这一步会自动停住,方便你在中间环节调试,监督程序运行。 利用它来指定程序代码的断点,使得程序在断点前停止执行,并进入调试模式,从而可以检查当前各个变量的值,dbstop in mfile 在文件名为mfile的第一个可执行语句前设置断点。 dbstop in mfile at lineno 在文件名为mfile的第lineno 行设置断点;如果第 lineno行为非执行语句,则在其后的第一个可执行语句前设置断点。 dbstop in mfile at
27、 subfun 在文件名为mfile的M文件的子程序subfun的第一个可执行语句前设置断点。 dbstop if error 在程序运行遇到错误时,自动设置断点。这里的错误不包括trycatch之间的错误,dbstop if all error 在程序运行遇到错误时,自动设置断点。这里的错误包括trycatch之间的错误。 dbstop if warning 在程序运行遇到警告时,自动设置断点。 dbstop if caught error 在程序运行trycatch间代码遇到错误时,自动设置断点。 dbstop if naninf 或 dbstop if infnan 当程序运行遇到无穷值
28、或者非数值时,自动设置断点,例子,function y=testdebug(x) n=length(x) y=(1:n)+x x只能为标量或行向量,如果为矩阵则出错,dbstop in testdebug dbstop if error testdebug(magic(3,2)清除断点,dbclear all 清除所有M文件中的所有断点。 dbclear all in mfile 清除文件名为mfile的M文件中的所有断点。 dbclear in mfile 清除文件名为mfile的M文件中第一个可执行语句前的断点。 dbclear in mfile at lineno 清除文件名为mfile
29、的M文件中第lineno行语句前的断点,dbclear in mfile at subfun 清除文件名为mfile的M文件中子程序subfun的第一个可执行语句前的断点。 dbclear if error 清除由dbstop if error设置的断点。 dbclear if warning 清除由dbstop if warning设置的断点。 dbclear if naninf 清除由dbstop if naninf设置的断点。 dbclear if infnan 清除由dbstop if infnan设置的断点,3)继续执行,dbcont 此命令可从断点处恢复程序的执行,直到遇到程序的另
30、一个断点或错误,4)调用堆栈,dbstack 此命令显示M文件名和断点产生的行号、调用此M文件的文件名和行号等,直到最高层的M文件,即列出了函数调用的堆栈,5)列出所有断点,dbstatus 此命令可列出所有的断点,包括错误、警告、nan和inf等。 dbstatus mfile 此命令可列出文件名为mfile的M文件中的所有断点,6)执行1行或多行语句,dbstep 执行当前M文件下一个可执行语句。 dbstep nlines 执行当前M文件下nlines行可执行语句。 dbstep in 当下一条可执行语句是对另一个函数的调用,此命令将从被调用函数的第一个可执行语句执行。 dbstep o
31、ut 此命令将执行函数剩余的代码然后停止,7)列出文件内容,dbtype mfile 列出文件名为mfile的M文件中的内容。 dbtype mfile start:end 列出文件名为mfile的M文件中指定行号范围的部分,8)切换工作空间,dbdown 遇到断点时,将当前工作空间切换到被调用M文件的工作空间。 dbup 将当前工作空间(断点处)切换到调用文件的工作空间,9)退出调试模式,dbquit 立即结束调试器并返回到基本工作空间,但所有断点仍有效,2以图形界面为主的程序调试,MATLAB自带的文本编辑器同时也是程序的编译器,用户可以在程序编辑后直接进行调试,更加方便和直观,通过新建M
32、文件打开文本编辑器和编译器,选择主菜单中【Debug】选项,其下拉菜单包括多种调试命令,如下图所示,下拉菜单中的命令有一部分在工具栏中有图标相对应,其功能与命令行调试程序是相同的,下面只对各命令做简单介绍,function arfa=maifun(x) n=length(x); s=sum(x); u=s/n; v=subfun(x,u); arfa=sqrt(v/(n-1,function z=subfun(x,y) z=0; for i=1:length(x) z=z+(x-y).2 end,标准差,也称均方差,是方差的算术平方根,v=1 2 3 4 5 6,std(v) ans = 1.
33、8708 mainfun(v) ans = 2.7386 1.6432 0.5477 0.5477 1.6432 2.7386,运行结果不正确,程序能运行通,说明程序没有语法错误; 运行结果不正确,说明存在逻辑错误,step 1:在主文件最后一行插入断点,step 2:在命令窗口运行程序,v=1 2 3 4 5 6; mainfun(v,step 3:判断出错原因,重新设置断点,step 4:再次运行程序,进行子程序调试,v=1 2 3 4 5 6; mainfun(v,step 5:发现错误,改正错误重新运行,function z=subfun(x,y) z=0; for i=1:lengt
34、h(x) z=z+(x-y).2; end,function z=subfun(x,y) z=0; for i=1:length(x) z=z+(x(i)-y).2; end,4.4 高级数据结构,4.4.1 多维数组 4.4.2 单元数组 4.4.3 结构体,4.4.1 多维数组,多维数组,下标多于2个,() zeros, ones, rand,or randn p = perms(1:4); A = magic(4); M = zeros(4,4,24); for k = 1:24 M(:,:,k) = A(:,p(k,:); end size(M) ans = 4 4 24,sum(M,d)计算第d个下标代表维的和。 sum(M,1 )计算第1个下标代表维(行)的和,结果:14 24, sum(M,2 )计算第2个下标代表维(列)的和,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年12月福建厦门市鹭江创新实验室管理序列岗位招聘8人参考题库附答案
- 2025年广西南宁市市政和园林管理局招聘外聘人员1人备考题库附答案
- 2025年大庆高新区公开招聘劳务派遣制人员招聘23人备考题库附答案
- 2025年国家矿山安全监察局安徽局安全技术中心招聘劳务派遣财务人员1名考试备考题库附答案
- 2025年陕西水务发展集团所属企业社会招聘(32人)考试参考题库附答案
- 2026四川广元市消防救援支队面向社会招录消防文员2人笔试备考试题及答案解析
- 2026福建福州工业园区开发集团有限公司设计勘察分公司招聘1人笔试参考题库及答案解析
- 四川中烟工业有限责任公司2026年度员工招聘笔试备考试题及答案解析
- 2026福建三明市永安市人民政府燕西街道办事处招聘编外聘用驾驶员1人笔试模拟试题及答案解析
- 吉安市新庐陵大数据有限公司2026年面向社会招聘派遣员工笔试备考题库及答案解析
- 王昭君课件教学课件
- DB34∕T 5176-2025 城市轨道交通智能运维系统建设指南
- 2025年福建泉州惠安县宏福殡仪服务有限公司招聘5人笔试考试参考题库及答案解析
- 2026年教师资格之中学教育知识与能力考试题库300道含答案(a卷)
- 肝硬化顽固性腹水个案护理
- 2026年上半年西藏省中小学教师资格考试(笔试)备考题库附答案(培优a卷)
- 《短视频制作与运营》教案 项目5 短视频剪辑 (剪映)
- 2025年11月5日更新的REACH第35批251项高度关注物质SVHC清单
- 2023年和田地区直遴选考试真题汇编附答案解析
- 《5G无线网络规划部署》课件-17、5G RF优化流程
- 屋顶彩钢瓦施工安装合同
评论
0/150
提交评论