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 =
blue
x=yesinput('输入元素个数',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语句
格式:
menu('菜单名',S1,S2,…,Sk)
功能:生成一个按钮式菜单系统
其中:
字符串S1,S2,…,Sk为菜单项(K≤32)。
函数返回值为用户选中的菜单项号。
如M-文件,menu_d.m如下:
%选择一种颜色
while 1
k=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 break
end
end
2.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.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 文件名
功能:
保存工作空间中的全体变量到指定文件(扩展名设定为.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,5
6,7,8,9,10
执行命令
load coff.txt
则命令
coff
将显示
coff=
1 2 3 4 5
- 7 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, 8 bits.
'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, 8 bits.
'uint16' 'integer*2' unsigned integer, 16 bits.
'uint32' 'integer*4' unsigned integer, 32 bits.
'uint64' 'integer*8' unsigned integer, 64 bits.
'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.1 if语句
格式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.2 switch语句
格式:
switch 表达式
case e1
语句组1
case {ex1,ex2,ex3,...}
语句组2
...
case {exp1,exp2,exp3,...}
语句组n
otherwise,
语句组n+1
end
功能:
若表达式的值为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')
otherwise
disp('Unknown method.')
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.3 try语句
格式2:
try
语句组1
catch
语句组2
end
功能:
执行语句组1,若执行语句组1的过程中发生错误则执行语句组2。可查看lasterr中的内容,获取错误信息。(lasterr('')清除错误信息)
2.2.4 选择语句的嵌套
当以上选择语句出现在另一个选择语句的语句组中时,即构成了选择语句的嵌套。
当选择语句嵌套时,应注意一个if必须与一个距离最近的end匹配。
2.3 循环结构语句
2.3.1 for语句
格式1:
for 变量=初值[:增量]:终值
语句组 %循环体
end
其中:
"增量"若省略时,增量值取为1。
功能:
表示对于变量从初值直到终值,每次变化一个增量的每一个值都执行语句组一次。
如:
for n = 1:100
x(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), end
ans =
1
ans =
6
ans =
8
2.3.2 while语句
格式:
while 表达式
语句组
end
当表达式的值为真或其实部为非0,重复执行语句组(循环体),直到表达式的值为0或其实部为0。
注意:表达式为数组时全部非0才为真。
如:
a=[1,3,5;–1,0,1]; n=0;
while a>0, n=n+1, end
由于a中含有一个0,故一次循环也未执行。
2.3.3 循环嵌套
在一个循环的循环体内又含有另一个循环结构,即构成循环的嵌套。
2.3.4 break语句
格式:
break
功能:
该语句将中止当前它所在的循环。
如:找出m~n之间的全体素数
function u=fq(m,n)
%找出m到n的全体素数 fq(m,n)
%若仅有一个参数则m= 2,给出参数作为n
%若没有参数则m = 2,n = 100
%1999.3
if nargin == 0,
m = 2; n = 100;
elseif nargin == 1,
n = m; m = 2;
end
i=1;
for t = m:n,
if t ~= 2;
for r = 2:t–1,
if fix(t/r)*r == t/r*r,
break
end
end
if r==t–1,u(i)=t;i=i+1;end
else
u(i)=t;i=i+1;
end
end
执行fq的运行结果:
ans =
Columns 1 through 12
2 3 5 7 11 13 17 19 23 29 31 37
Columns 13 through 24
41 43 47 53 59 61 67 71 73 79 83 89
Column 25
97
2.4 文件读写函数
1、fopen函数
fid = fopen('文件名','权限')
其中:
权限—可为‘r’(只读)、‘w’(只写)、
‘a’(追加)、‘rb’(二进制文件
只读)、‘wb’(二进制文件只写)、
‘ab’(二进制文件追加)、‘rt’(文
本文件只读)、‘wt’(文本文件只
写)、‘at’(文本文件追加)。
功能:
函数执行成功,fid中为一整数,表示文件代号;否则为–1。
(fid:规定标准输入为0,标准输出为1,错误信息文件为2)
2、fclose函数
fclose(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函数
[变量,count] = fread(fid,长度)
功能:
读fid文件中的二进制数据到变量中,长度含义同fscanf函数。
6、fwrite函数
count = fwrite(fid,变量)
功能:
将变量中的全体元素按二进制形式写入fid文件中。count为成功写入的元素个数。
7、fgetl函数与fgets函数
变量= fgetl(fid)
变量= fgets(fid)
功能:
均为从fid中读入一行,但前者读入时不含回车换行,而后者包含回车换行。
还有其它一些函数,请参阅相关书籍。
-
- 一个可运行MATLAB命令的函数
格式:
eval('字符串')
功能:
该函数将执行宏替换:即把字符串看成一个命令(有点类似于C中的System函数)
如:
for n = 1:3
eval(['M',num2Str(n),'= magic(n)'])
end
执行后结果为:
M1 = %1阶魔方阵
1
M2 = %2阶魔方阵
1 3
4 2
M3 = %3阶魔方阵
8 1 6
3 5 7
4 9 2
注意:程序中方括号的使用,可把其中各字符子串拼接起来,也可写成:
f = ['M',num2str(n),'magic(n)']);
eval(f)
又如:
m=5;t='1/(i-1+j)';
a = zeros(m);
for i = 1:m
for j = 1:m
a(i,j) = eval(t);
end
end
a
执行后结果为:
a =
1.0000 0.5000 0.3333 0.2500 0.2000
0.5000 0.3333 0.2500 0.2000 0.1667
0.3333 0.2500 0.2000 0.1667 0.1429
0.2500 0.2000 0.1667 0.1429 0.1250
0.2000 0.1667 0.1429 0.1250 0.1111
在MATLAB中还有其他类似的函数,如:
feval, evalin, assignin, evalc
-
- 局部工作空间和基本工作空间
在MATLAB命令窗口中使用的工作空间为基本工作空间,在该窗口中定义的变量、非函数文件中定义的变量以及全局变量均存在于该工作空间中。
各函数文件中所定义的变量仅存在于相应的局部工作空间中,也就是说,一个函数文件执行结束后,其定义的变量也随之消失了。
函数文件之间可以通过输入、输出参数传递信息。也可以通过使用全局变量传递信息。
global 变量名表
该命令使相应变量名表中的变量成为全局变量,出现在各函数中global命令中的相同变量名将取得同一值(即全局变量是按共名原理设计的)。