第2章MATLAB 程序设计
MATLAB 语言为解释型程序设计语言。在程序中可以出现顺序、选择、循环三种基本控制结构,也可以出现对M-文件的调用(相当于对外部过程的调用)。
由于 MATLAB 开始是用 FORTRAN 语言编写、后来用C 语言重写的,故其既有 FORTRAN 的特征,又在许多语言规则方面与 C 语言相同。
2.1顺序结构语句
在顺序结构语句中,包括表达式语句、赋值语句、输入输出语句、空语句等。
2.1.1表达式语句
格式:
表达式,%显示表达式值
表达式;%不显示表达式值
表达式%显示表达式值
如:
x+y,
s i n(x);
–5
最后的表达式值暂保存在变量 ans 中。
2.1.2赋值语句
格式:
v=表达式,%结果送 v 并显示 v v=表达式;%结果送 v 不显示 v v=表达式%结果送 v 并显示 v 2.1.3空语句
格式:
,
;
2.1.4输入语句
1、i n p u t语句(实际上是函数)
格式 1:
i n p u t(提示字符串)
功能:
显示提示字符串,可输入数字、字符串(两端用单引号括起)、或表达式
格式 2:i n p u t(提示字
符串,'s')功能:
显示提示字符串,并把输入视为字符串
2、y e s i n p u t语句
格式:
y e s i n p u t(提示字符串,缺省值,值范围)
功能:
显示提示字符串和缺省值,若只打入回车则以缺省值作为输入值,若输入的值不在指定范围内则认为输入无效,B 并等待用户重新输入。
如:
t=y e s i n p u t('指定线的颜色',…
'r e d','r e d|b l u e|g r ee n')
运行结果如下:
指定线的颜色(red):yellow %不在值内
指定线的颜色(red):blue %重输
t =
b l u e
x=y e s i n p u t('输入元素个数',10,[1,20])
运行结果如下:
输入元素个数(10):
x =
10
3、Keyboard 语句
格式:
Keyboard
功能:
暂停M-文件的执行,并等待用户从键盘输入命令以查看或改变变量的值,直到输入return 命令而返回相应的 M-文件继续执行。本语句用于调试 M-文件。
4、pause 语句
格式 1:
pause
功能:暂停,敲下任一键继续
格式 2:
pause(n)
功能:暂停 n 秒
格式 3:
puase on
功能:本命令后的 pause 语句有效
格式 4:
pause off
功能:本命令后的 pause 语句无效
5、menu 语句
格式:
m e nu('菜单名',S1,S2,…,S k)
功能:生成一个按钮式菜单系统
其中:
字符串S1,S2,…,S k为菜单项(K≤32)。
函数返回值为用户选中的菜单项号。
如M-文件,m e nu_d.m如下:
%选择一种颜色
w h il e1
k=m e nu('选择一种颜色','红色',…
'黄色','兰色','绿色','白色','关闭');
i f k==1c o l o r='R e d'
elseif k==2c o l o r='Y e ll o w'
elseif k==3c o l o r='B l u e'
elseif k==4c o l o r='G r ee n'
elseif k==5c o l o r='W h i t e'
elseif k==6break
end
end
2.1.5输出语句
1、直接终端显示
当一个表达式、赋值语句等语句用逗号或者回车作为结尾符,而不是分号作为结尾符时,该表达式或赋值语句的运行结果均在终端上显示出来。
2、d i a r y语句(日记)
格式 1:
d i a r y文件名
功能:
打开指定的文件并将该语句之后终端显
示的内容(包括键入的命令和输出结果)记入该文件。
格式 2:
d i a r y o ff
功能:
暂停记入显示内容到指定的文件
格式 3:
d i a r y o n
功能:
继续记入显示内容到指定的文件
d i a r y语句可产生一个日志文本文件,为以后书写报告或编辑 M-文件提供素材。
3.d i s p语句
格式:
d i s p(x)
功能:显示 x 的值,但不显示 x 的名
4.s printf 语句
格式:
[Str,ErrMsg] = SPRINTF(格式串,表达式1,...)
其中:格式串与C 语言的规定一致
Str 存放结果的
功能:
按照格式串的规定把各表达式的实部分别转换为字符串并存入Str,若有错误,则把错误信息存入ErrMsg
如:
sprintf('%0.5g',(1+sqrt(5))/2) 1.618
sprintf('%0.5g',1/eps) 4.5036e+15
sprintf('%15.5f',1/eps) 4503599627370496.00000 sprintf('%d',round(pi)) 3
sprintf('%s','hello') hello
sprintf('The array is %dx%d.',2,3) The array is 2x3.
sprintf('\n') 换行
2.1.6变量值的保存与恢复
1、保存工作空间中的变量到文件中
格式 1:
save 文件名
功能:
保存工作空间中的全体变量到指定文件(扩展名设定为.m a t)中。若省略文件名,则文件名缺省为"M A T L A B.m a t"。该文件为二进制格式,称为MAT文件。
格式 2:
save 文件名变量名表[-append]
功能:
保存指定的变量到文件中。变量名表中两变量之间用逗号或空格分开。
格式 3:
save 文件名变量名表-ascii [-tabs]
功能:
用 8 位数、ASCII 码格式保存指定的变量到文件中。
格式 4:
s ave文件名变量名表-a s c ii–d o u b l e[-t a b s]功能:
用 16 位数、ASCII 码格式保存变量到指定文件中。
2、保存工作空间中的变量到 C 风格文件中
相关语句 ( 后面详介):fid=fopen
(文件名,权限串) fwrite(fid,
表达式,精度串)%二进制fprintf(fid,
格式串,表达式) fclose(fid)
3、恢复变量到工作空间
格式 1:
l o a d
功能:
从"M A T L A B.m a t"文件中恢复变量
格式 2:
l o a d文件名
功能:
从指定文件中恢复变量
格式 3:
l o a d文件名-a s c ii
功能:
从无扩展名的文本文件中生成一个以文件名为变量名的数组(文件中含有m 行、n 列数据)。
格式 4:
l o a d文件名.扩展名-m a t
功能:
从具有指定扩展名的MAT 文件中恢复变量。
格式5:
l o a d文件名.扩展名
功能:
从具有指定扩展名的文本文件生成与文件名同名的数组(文件中含有m 行、n 列数据)。
例如:
设文本文件c o ff.t x t中的数据为:
1,2,3,4,5
6,7,8,9,10
执行命令
l o a d c o ff.t x t
则命令
coff
将显示
coff=
12345
678910
格式 6:
[A,C o un t]=f r ea d(f i d,s i z e,p r e c i s i o n)
[A,Count] = fscanf(fid,format,size)
其中:
p r e c i s i o n可为:
M A T L A B C o r F o r t r a n D e s c r i p t i o n
'u c h a r''un s i g n e d c h a r'un s i g n e d c h a r a c t e r,
8b i t s.
's c h a r''s i g n e d c h a r's i g n e d c h a r a c t e r,
8b i t s.
'i n t8''i n t e g e r*1'i n t e g e r,8b i t s.
'i n t16''i n t e g e r*2'i n t e g e r,16b i t s. 'i n t32''i n t e g e r*4'i n t e g e r,32b i t s. 'i n t64''i n t e g e r*8'i n t e g e r,64b i t s.
'u i n t8''i n t e g e r*1'un s i g n e d i n t e g e r,
8b i t s.
'u i n t16''i n t e g e r*2'un s i g n e d i n t e g e r,
16b i t s.
'u i n t32''i n t e g e r*4'un s i g n e d i n t e g e r,
32b i t s.
'u i n t64''i n t e g e r*8'un s i g n e d i n t e g e r,
64b i t s.
's i n g l e''r ea l*4'f l o a t i n g p o i n t,
32b i t s.
'f l o a t32''r ea l*4'f l o a t i n g p o i n t,
32b i t s.
'd o u b l e''r ea l*8'f l o a t i n g p o i n t,
64b i t s.
'f l o a t64''r ea l*8'f l o a t i n g p o i n t,
64b i t s.
功能:
从 C 风格文件中读入size 个数据到A,Count 为实际读入数据个数
2.2选择结构
2.2.1if 语句
格式 1:
if 表达式
语句组
end
功能:
若表达式值的实部或值为真,则执行语句组
格式 2:
if 表达式
语句组 1
else
语句组 2
end
功能:
若表达式值实部非 0 或值为真,则执行语句组1,否则执行语句组 2。
格式 3:
if 表达式 1
语句组1
elseif 表达式 2
语句组 2
┆
elseif 表达式n
语句组 n
else
语句组 n+1
end
功能:
若表达式 1 为真则执行语句组 1
否则,若表达式 2 为真则执行语句 2 ┆
否则若表达式 n 为真则执行语句组 n 否则执行语句组 n+1
2.2.2s w i t c h语句
格式:
s w i t c h表达式
case e1
语句组 1
c a s e{ex1,ex2,ex3,...}
语句组 2
...
c a s e{ex p1,ex p2,ex p3,...}
语句组 n
o t h e r w i s e,
语句组 n+1
end
功能:
若表达式的值为 e1 则执行语句组 1
否则,若表达式的值为ex1,ex2,ex3,…中的一个,则执行语句组 2
…
否则,表达式的值为ex p1,ex p2,ex p3,…中的一个,则执行语句组 n
否则,则执行语句组 n+1
例如:
s w i t c h l o w e r(M E T H O D)
c a s e{'li n ea r','b ili n ea r'}
d i s p('M
e t h o d i s li n ea r')
c a s e'c u b i c'
d i s p('M
e t h o d i s c u b i c')
c a s e'n ea r e s t'
d i s p('M
e t h o d i s n ea r e s t')
o t h e r w i s e
d i s p('U n k n o w n m
e t h o d.')
end
(switch 语句是 5.0 以上版本中增加的,可以用更加简洁的方式描述多向选择)
例如:
clear;
%创建元胞数组:a,b,c,d
for 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:5
switch S(i).Marks
case 100
S(i).Rank='满分';
case a
S(i).Rank=' 优秀';
case b
S(i).Rank=' 良好';
case c
S(i).Rank=' 及格';
otherwise
S(i).Rank='不及格';
end
end
%
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.3try 语句
格式 2:
try
语句组 1
catch
语句组 2
end
功能:
执行语句组 1,若执行语句组 1 的过程中发生错误则执行语句组 2。可查看lasterr 中的内容,获取错误信息。(lasterr('')清除错误信息)
2.2.4选择语句的嵌套
当以上选择语句出现在另一个选择语句的语句组中时,即构成了选择语句的嵌套。
当选择语句嵌套时,应注意一个if 必须与一个距离最近的 end 匹配。
2.3循环结构语句
2.3.1for 语句
格式 1:
for 变量=初值[:增量]:终值
语句组%循环体
end
其中:
"增量"若省略时,增量值取为 1。
功能:
表示对于变量从初值直到终值,每次变化一个增量的每一个值都执行语句组一次。
如:
f o r n=1:100
x(n)= s i n(n*p i/100);
end
本格式的 for 语句用于执行一定次数的循环
格式 2:
for 变量=数组名
语句组%循环体
end
功能:
每次循环时取数组的下一列元素(第一
次循环时取第 1 列元素)赋给变量(故变量本身成为数组),然后执行语句组,直到数组的全体列都取完为止。
如:
a=[1,5,9;0,–1,1];
f o r n=a,n(1)–n(2),e n d
ans =
1
ans =
6
ans =
8
2.3.2w h il e语句
格式:
w h il e表达式
语句组
end
当表达式的值为真或其实部为非 0,重复执行语句组(循环体),直到表达式的值为 0 或其实部为0。
注意:表达式为数组时全部非 0 才为真。
如:
a=[1,3,5;–1,0,1];n=0;
w h il e a>0,n=n+1,e n d
由于 a 中含有一个 0,故一次循环也未执行。
2.3.3循环嵌套
在一个循环的循环体内又含有另一个循环结构,即构成循环的嵌套。
2.3.4break 语句
格式:
break
功能:
该语句将中止当前它所在的循环。
如:找出 m~n 之间的全体素数
f un c t i o n u=f q(m,n)
%找出 m 到 n 的全体素数 f q (m ,n )
%若仅有一个参数则 m= 2,给出参数作为 n %若没有参数则 m = 2,n = 100 %1999.3
i f n a r g i n == 0,
m = elseif 2; n = n a r g i n 100; == 1,
n = m ; m = 2; end i =1;
f o r t = m :n ,
i f t ~= 2;
f o r r = 2:t –1,
if fix(t/r)*r == t/r *r,
break end end
i f r ==t –1,u (i )=t ;i =i +1;e n d else
u (i )=t ;i =i +1; end end
执行 fq 的运行结果:
ans =
C o l u m n s 1t h r o u g h12
2 3 5 7 11 13 17
19 23 29 31 37
C o l u m n s 13t h r o u g h24
41 43 47 53 59 61 67
71 73 79 83 89
C o l u m n25
97
2.4文件读写函数
1、fopen 函数
f i d=f o p e n('文件名','权限')
其中:
权限—可为‘r’(只读)、‘w’(只写)、
‘a’(追加)、‘rb’(二进制文件
只读)、‘wb’(二进制文件只写)、
‘ab’(二进制文件追加)、‘rt’(文
本文件只读)、‘w t’(文本文件只
写)、‘at’(文本文件追加)。
功能:
函数执行成功,f i d中为一整数,表示文件代号;否则为–1。