第2章M ATLAB程序设计MATLAB语言为解释型程序设计语言。
在程序中可以出现顺序、选择、循环三种基本控制结构,也可以出现对M-文件的调用(相当于对外部过程的调用)。
由于 MATLAB开始是用FORTRAN语言编写、后来用 C语言重写的,故其既有FORTRAN的特征,又在许多语言规则方面与C语言相同。
2.1 顺序结构语句在顺序结构语句中,包括表达式语句、赋值语句、输入输出语句、空语句等。
2.1.1 表达式语句格式:表达式,%显示表达式值表达式;%不显示表达式值表达式%显示表达式值如:x + y,sin(x);–5最后的表达式值暂保存在变量ans中。
2.1.2 赋值语句格式:v =表达式,%结果送v并显示v v =表达式;%结果送v不显示v v =表达式%结果送v并显示v 2.1.3 空语句格式:,;2.1.4 输入语句1、input语句(实际上是函数)格式1:input(提示字符串)功能:显示提示字符串,可输入数字、字符串(两端用单引号括起)、或表达式格式2:input(提示字符串,'s')功能:显示提示字符串,并把输入视为字符串2、yesinput语句格式:yesinput(提示字符串,缺省值,值范围)功能:显示提示字符串和缺省值,若只打入回车则以缺省值作为输入值,若输入的值不在指定范围内则认为输入无效,B并等待用户重新输入。
如: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(n)功能:暂停n秒格式3:puase on功能:本命令后的pause语句有效格式4:pause off功能:本命令后的pause语句无效5、menu语句格式:menu('菜单名',S1,S2,…,S k)功能:生成一个按钮式菜单系统其中:字符串S1,S2,…,S k为菜单项(K≤32)。
函数返回值为用户选中的菜单项号。
如M-文件,menu_d.m如下:%选择一种颜色while 1k=menu('选择一种颜色','红色',…'黄色','兰色','绿色','白色','关闭');if k = = 1 color = 'Red'elseif k = = 2 color = 'Yellow'elseif k = = 3 color = 'Blue'elseif k = = 4 color = 'Green'elseif k = = 5 color = 'White'elseif k = = 6 breakendend2.1.5 输出语句1、直接终端显示当一个表达式、赋值语句等语句用逗号或者回车作为结尾符,而不是分号作为结尾符时,该表达式或赋值语句的运行结果均在终端上显示出来。
2、diary语句(日记)格式1:diary文件名功能:打开指定的文件并将该语句之后终端显示的内容(包括键入的命令和输出结果)记入该文件。
格式2:diary off功能:暂停记入显示内容到指定的文件格式3:diary on功能:继续记入显示内容到指定的文件diary语句可产生一个日志文本文件,为以后书写报告或编辑M-文件提供素材。
3.disp语句格式:disp(x)功能:显示x的值,但不显示x的名4.sprintf语句格式:[Str,ErrMsg] = SPRINTF(格式串,表达式1,...)其中:格式串与C语言的规定一致Str存放结果的功能:按照格式串的规定把各表达式的实部分别转换为字符串并存入Str,若有错误,则把错误信息存入ErrMsg如:sprintf('%0.5g',(1+sqrt(5))/2) 1.618sprintf('%0.5g',1/eps) 4.5036e+15sprintf('%15.5f',1/eps) 4503599627370496.00000 sprintf('%d',round(pi)) 3sprintf('%s','hello') hellosprintf('The array is %dx%d.',2,3) The array is 2x3.sprintf('\n') 换行2.1.6变量值的保存与恢复1、保存工作空间中的变量到文件中格式1:save 文件名功能:保存工作空间中的全体变量到指定文件(扩展名设定为.mat)中。
若省略文件名,则文件名缺省为"MATLAB.mat"。
该文件为二进制格式,称为MAT 文件。
格式2:save 文件名变量名表 [-append]功能:保存指定的变量到文件中。
变量名表中两变量之间用逗号或空格分开。
格式3:save 文件名变量名表 -ascii [-tabs]功能:用8位数、ASCII码格式保存指定的变量到文件中。
格式4:save 文件名变量名表 -ascii –double[-tabs] 功能:用16位数、ASCII码格式保存变量到指定文件中。
2、保存工作空间中的变量到C风格文件中相关语句(后面详介):fid=fopen(文件名,权限串)fwrite(fid,表达式,精度串)%二进制fprintf(fid,格式串,表达式)fclose(fid)3、恢复变量到工作空间格式1:load功能:从"MATLAB.mat"文件中恢复变量格式2:load 文件名功能:从指定文件中恢复变量格式3:load 文件名 -ascii功能:从无扩展名的文本文件中生成一个以文件名为变量名的数组(文件中含有m行、n列数据)。
格式4:load 文件名.扩展名 -mat功能:从具有指定扩展名的MAT文件中恢复变量。
格式5:load 文件名.扩展名功能:从具有指定扩展名的文本文件生成与文件名同名的数组(文件中含有m行、n列数据)。
例如:设文本文件coff.txt中的数据为:1,2,3,4,56,7,8,9,10执行命令load coff.txt则命令coff将显示coff=1 2 3 4 567 8 9 10格式6:[A, Count] = fread(fid,size,precision)[A,Count] = fscanf(fid,format,size)其中:precision可为:MATLAB C or Fortran Description'uchar' 'unsigned char' unsigned character,8 bits.'schar' 'signed char' signed character, 8bits.'int8' 'integer*1' integer, 8 bits.'int16' 'integer*2' integer, 16 bits.'int32' 'integer*4' integer, 32 bits.'int64' 'integer*8' integer, 64 bits.'uint8' 'integer*1' unsigned integer, 8bits.'uint16' 'integer*2' unsigned integer, 16bits.'uint32' 'integer*4' unsigned integer, 32bits.'uint64' 'integer*8' unsigned integer, 64bits.'single' 'real*4' floating point,32 bits.'float32' 'real*4' floating point,32 bits.'double' 'real*8' floating point,64 bits.'float64' 'real*8' floating point,64 bits.功能:从C风格文件中读入size个数据到A,Count 为实际读入数据个数2.2选择结构2.2.1 if语句格式1:if 表达式语句组end功能:若表达式值的实部或值为真,则执行语句组格式2:if 表达式语句组1else语句组2end功能:若表达式值实部非0或值为真,则执行语句组1,否则执行语句组2。
格式3:if 表达式1语句组1elseif 表达式2语句组2┆elseif 表达式n语句组nelse语句组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例如:switch lower(METHOD)case {'linear','bilinear'}disp('Method is linear')case 'cubic'disp('Method is cubic')case 'nearest'disp('Method is nearest')otherwisedisp('Unknown method.')end(switch语句是5.0以上版本中增加的,可以用更加简洁的方式描述多向选择)例如:clear;%创建元胞数组:a,b,c,dfor i=1:10;a{i}=89+i;b{i}=79+i;c{i}=69+i;d{i}=59+i;end;c=[d,c];Name={'李洪斌','赵向阳','龚力','王立伟','马玉书'};Mark={72,83,56,94,100};Rank=cell(1,5);%S=struct('Name',Name,'Marks',Mark,'Rank',Rank);%for i=1:5switch S(i).Markscase 100S(i).Rank='满分';case aS(i).Rank=' 优秀';case bS(i).Rank=' 良好';case cS(i).Rank=' 及格';otherwiseS(i).Rank='不及格';endend%disp(['学生姓名 ',' 得分 ',' 等级']);for i=1:5;disp([S(i).Name,blanks(6),num2str(S(i).Marks),blanks(6),S(i ).Rank]);end;学生姓名得分等级李洪斌 72 及格赵向阳 83 良好龚力 56 不及格王立伟 94 优秀马玉书 100 满分2.2.3 try语句格式2:try语句组1catch语句组2end功能:执行语句组1,若执行语句组1的过程中发生错误则执行语句组2。