1、第 2 章 MATLAB 程序设计MATLAB 语言为解释型程序设计语言。在程序中可以出现顺序、选择、循环三种基本控制结构,也可以出现对 M-文件的调用(相当于对外部过程的调用)。由于 MATLAB 开始是用 FORTRAN 语言编写、后来用 C 语言重写的,故其既有 FORTRAN 的特征,又在许多语言规则方面与 C 语言相同。2.1 顺序结构语句在顺序结构语句中,包括表达式语句、赋值语句、输入输出语句、空语句等。2.1.1 表达式语句格式:表达式, 显示表达式值表达式; 不显示表达式值表达式 显示表达式值如:x + y,sin(x);5最后的表达式值暂保存在变量 ans 中。2.1.2 赋
2、值语句格式:v = 表达式, 结果送 v 并显示 vv = 表达式; 结果送 v 不显示 vv = 表达式 结果送 v 并显示 v2.1.3 空语句格式:,;2.1.4 输入语句1、input 语句(实际上是函数)格式 1:input(提示字符串)功能:显示提示字符串,可输入数字、字符串(两端用单引号括起)、或表达式 格式 2:input(提示字符串,s)功能:显示提示字符串,并把输入视为字符串2、yesinput 语句格式:yesinput(提示字符串,缺省值,值范围)功能:显示提示字符串和缺省值,若只打入回车则以缺省值作为输入值,若输入的值不在指定范围内则认为输入无效,B 并等待用户重新输
3、入。如:t=yesinput(指定线的颜色 ,red,red|blue|green)运行结果如下:指定线的颜色(red):yellow %不在值内指定线的颜色(red):blue %重输t = bluex=yesinput(输入元素个数 ,10,1,20)运行结果如下:输入元素个数(10):x = 103、Keyboard 语句格式:Keyboard功能:暂停 M-文件的执行,并等待用户从键盘输入命令以查看或改变变量的值,直到输入 return 命令而返回相应的 M-文件继续执行。本语句用于调试 M-文件。4、pause 语句格式 1:pause 功能:暂停,敲下任一键继续格式 2:pause
4、(n) 功能:暂停 n 秒格式 3:puase on 功能:本命令后的 pause 语句有效格式 4:pause off 功能:本命令后的 pause 语句无效5、menu 语句格式:menu(菜单名,S 1,S2,Sk)功能:生成一个按钮式菜单系统其中:字符串 S1,S2,Sk 为菜单项 (K32)。函数返回值为用户选中的菜单项号。如 M-文件,menu_d.m 如下:%选择一种颜色while 1k=menu(选择一种颜色,红色,黄色,兰色, 绿色,白色,关闭);if k = = 1 color = Redelseif k = = 2 color = Yellowelseif k = = 3
5、 color = Blueelseif k = = 4 color = Greenelseif k = = 5 color = Whiteelseif k = = 6 breakendend 2.1.5 输出语句1、直接终端显示当一个表达式、赋值语句等语句用逗号或者回车作为结尾符,而不是分号作为结尾符时,该表达式或赋值语句的运行结果均在终端上显示出来。2、diary 语句(日记)格式 1:diary 文件名功能:打开指定的文件并将该语句之后终端显示的内容(包括键入的命令和输出结果)记入该文件。格式 2:diary off功能:暂停记入显示内容到指定的文件格式 3:diary on功能:继续记入
6、显示内容到指定的文件diary 语句可产生一个日志文本文件,为以后书写报告或编辑 M-文件提供素材。2.1.6 变量值的保存与恢复1、保存工作空间中的变量到文件中格式 1:save 文件名功能:保存工作空间中的全体变量到指定文件(扩展名设定为.mat)中。若省略文件名,则文件名缺省为MATLAB.mat。该文件为二进制格式,称为 MAT文件。格式 2:save 文件名 变量名表功能:保存指定的变量到文件中,变量名表中两变量之间用逗号或空格分开。格式 3:save 文件名 变量名表 -ascii功能:用 8 位 ASCII 码格式保存指定的变量到文件中。格式 4:save 文件名 变 量名表 -
7、ascii double功能:用 16 位 ASCII 码格式保存变量到指定文件中。2、恢复变量到工作空间格式 1:load功能:从MATLAB.mat文件中恢复变量格式 2:load 文件名功能:从指定文件中恢复变量格式 3:load 文件名 -ascii功能:从无扩展名的文本文件中生成一个以文件名为变量名的数组(文件中含有 m 行、n 列数据)。格式 4:load 文件名.扩 展名 -mat功能:从具有指定扩展名的 MAT 文件中恢复变量。格式 5:load 文件名.扩 展名功能:从具有指定扩展名的文本文件生成与文件名同名的数组(文件中含有 m 行、 n 列数据)。例如:设文本文件 cof
8、f.txt 中的数据为:1,2,3,4,56,7,8,9,10执行命令load coff.txt则命令coff将显示coff=1 2 3 4 56 7 8 9 102.2 选择结构2.2.1 if 语句格式 1:if 表达式,语句 1,语句 n ,end语句组 功能:若表达式值的实部非 0 或值为真,则执行语句1语句 n(称为语句组)格式 2:if 表达式,语句组 1else 语句组 2end功能:若表达式值实部非 0 或值为真,则执行语句组1,否则执行语句组 2。格式 3:if 表达式 1,语句组 1 elseif 表达式 2,语句组 2elseif 表达式 n,语句组 nelse 语句组
9、n+1end功能:若表达式 1 为真则执行语句组 1否则,若表达式 2 为真则执行语句 2否则若表达式 n 为真则执行语句组 n否则执行语句组 n+12.2.2 switch 语句格式:switch 表达式case e1 语句组 1case ex1,ex2,ex3,.语句组 2.case exp1,exp2,exp3,.语句组 notherwise, 语句组 n+1end功能:若表达式的值为 e1 则执行语句组 1否则,若表达式的值为 ex1,ex2,ex3,中的一个,则执行语句组 2否则,表达式的值为 exp1,exp2,exp3,中的一个,则执行语句组 n否则,则执行语句组 n+1例如:s
10、witch lower(METHOD)case linear,bilineardisp(Method is linear)case cubicdisp(Method is cubic)case nearestdisp(Method is nearest)otherwisedisp(Unknown method.)end(switch 语句是 5.0 以上版本中增加的,可以用更加简洁的方式描述多向选择)2.2.3 选择语句的嵌套当以上选择语句出现在另一个选择语句的语句组中时,即构成了选择语句的嵌套。当选择语句嵌套时,应注意一个 if 必须与一个距离最近的 end 匹配。2.3 循环结构语句2.3
11、.1 for 语句格式 1:for 变量初值: 增量: 终值语句组 循环体end其中:增量若省略时,增量值取为 1。功能:表示对于变量从初值直到终值,每次变化一个增量的每一个值都执行语句组一次。如:for n = 1:100x(n) = sin(n pi/100);end本格式的 for 语句用于执行一定次数的循环格式 2:for 变量数组名语句组 循环体end功能:每次循环时取数组的下一列元素(第一次循环时取第 1 列元素)赋给变量(故变量本身成为数组),然后执行语句组,直到数组的全体列都取完为止。如:a=1,5,9;0,1,1;for n=a,n(1)n(2), endans = 1ans
12、 = 6ans = 82.3.2 while 语句格式:while 表达式, 语句组, end当表达式的值为真或其实部为非 0,重复执行语句组(循环体),直到表达式的值为 0 或其实部为0。注意:表达式为数组时全非 0 为真。如:a=1,3,5;1,0,1; n=0;while a0, n=n+1, end由于 a 中含有一个 0,故一次循环也未执行。2.3.3 循环嵌套在一个循环的循环体内又含有另一个循环结构,即构成循环的嵌套。2.3.4 break 语句格式:break功能:该语句将中止当前它所在的循环。如:找出 m n 之间的全体素数function u=fq(m,n)找出 m 到 n
13、的全体素数 fq(m,n)若仅有一个参数则 m= 2,给出参数作为 n若没有参数则 m = 2,n = 1001999.3if nargin = 0,m = 2; n = 100;elseif nargin = 1,n = m; m = 2;endi=1;for t = m:n,if t = 2;for r = 2:t1,if fix(t/r)r = t/rr,breakendendif r=t1,u(i)=t;i=i+1;endelseu(i)=t;i=i+1;endend执行 fq 的运行结果:ans =Columns 1 through 12 2 3 5 7 11 13 17 19 23
14、 29 31 37Columns 13 through 24 41 43 47 53 59 61 67 71 73 79 83 89Column 25 972.4 文件读写函数1、fopen 函数fid = fopen(文件名,权限)其中:权限可为 r(只读)、 w(只写)、a(追加)、 rb(二进制文件只读)、wb (二进制文件只写)、ab(二进制文件追加)、 rt(文本文件只读)、wt (文本文件只写)、 at(文本文件追加)。功能:函数执行成功,fid 中为一整数,表示文件代号;否则为1。(fid:规定标准输入为 0,标准输出为 1,错误信息文件为 2)2、fclose 函数fclose
15、(fid)或 fclose(all)3、fprintf 函数count=fprintf(fid,格式串,输出名表)功能:将输出名表中的成员依次按格式串输出到 fid 文件中,返回输出的字节数。关于格式串的规定与 C相同。如%s (字符串输出)、 %d(整数输出)、%10.2f(实数输出,共 10 个字符宽,含两位小数)等。4、Fscanf 函数变量,count=fscanf(fid,格式串,长度)功能:从文件 fid 中读取指定长度(按格式串控制)的数据到变量中,count 为读入字节数,若长度省略 ,表示整个文件。若为m,n表示读入一个 m 行 n 列的矩阵到变量中。5、fread 函数变量
16、,count = fread(fid, 长度)功能:读 fid 文件中的二进制数据到变量中,长度含义同 fscanf 函数。6、fwrite 函数count = fwrite(fid,变量)功能:将变量中的全体元素按二进制形式写入 fid 文件中。count 为成功写入的元素个数。7、fgetl 函数与 fgets 函数变量= fgetl(fid)变量= fgets(fid)功能:均为从 fid 中读入一行,但前者读入时不含回车换行,而后者包含回车换行。还有其它一些函数,请参阅相关书籍。2.5 MATLAB 的编程与调试环境2.5.1MATLAB 的编程与调试窗口在新建或打开一个 M 文件时,
17、将出现MATLAB 的编程与调试窗口。利用该窗口,可打开多个 M 文件,对每个 M 文件可设置/取消断点(F12)、单步跟踪 M 函数文件的运行(F10)、察看或修改有关变量的当前值和变量名(打开工作空间浏览器 Workspace Browser)等,从而加快程序设计进程。关于 MATLAB 的编程与调试窗口的使用和 MATLAB 调试命令的使用,请自学教程有关部分。2.6 一个可运行 MATLAB 命令的函数格式:eval(字符串)功能:该函数将执行宏替换:即把字符串看成一个命令(有点类似于 C 中的 System 函数)如:for n = 1:3eval(M,num2Str(n),= ma
18、gic(n)end 执行后结果为:M1 = 1 阶魔方阵1M2 = 2 阶魔方阵1 34 2M3 = 3 阶魔方阵8 1 63 5 74 9 2 注意:程序中方括号的使用,可把其中各字符子串拼接起来,也可写成:f = M,num2str(n),magic(n);eval(f)又如:m=5;t=1/(i-1+j);a = zeros(m);for i = 1:mfor j = 1:ma(i,j) = eval(t);endenda 执行后结果为:a =1.0000 0.5000 0.3333 0.2500 0.20000.5000 0.3333 0.2500 0.2000 0.16670.333
19、3 0.2500 0.2000 0.1667 0.14290.2500 0.2000 0.1667 0.1429 0.12500.2000 0.1667 0.1429 0.1250 0.1111 2.7 局部工作空间和基本工作空间在 MATLAB 命令窗口中使用的工作空间为基本工作空间,在该窗口中定义的变量、非函数文件中定义的变量以及全局变量均存在于该工作空间中。各函数文件中所定义的变量仅存在于相应的局部工作空间中,也就是说,一个函数文件执行结束后,其定义的变量也随之消失了。函数文件之间可以通过输入、输出参数传递信息。也可以通过使用全局变量传递信息。global 变量名表该命令使相应变量名表中的变量成为全局变量,出现在各函数中 global 命令中的相同变量名将取得同一值(即全局变量是按共名原理设计的)。