1.5 M文件与编程
1.5.1 M文件编辑/调试器窗口
在默认状态下,M文件编辑/调试器(Editor/Debugger)窗口不随MATLAB界面的出现而启动。当需要编写M文件时,在主界面的主页上单击“新建脚本”按钮,即可启动该窗口。如图1-17所示。
图1-17 M文件编辑/调试器窗口
M文件编辑/调试器的菜单与工具栏请参考“帮助”系统。
1.5.2 M文件
M文件是由MATLAB语句(命令或函数)构成的ASCII码文本文件,文件名必须以“.m”为扩展名。M文件通过M文件编辑/调试器生成。在命令行窗口调用M文件,可实现一次执行多条MATLAB语句的功能。M文件有以下两种形式。
1.M脚本文件
脚本文件是MATLAB命令或函数的组合,没有输入输出参数,执行脚本文件只需在命令行窗口中键入文件名并按回车键,或在M文件编辑/调试器窗口激活状态下直接按“运行”按钮或按“F5”键。
当用户要运行的指令较多时,可以直接从键盘上逐行输入指令,但这样做显得很麻烦,而命令文件则可以较好地解决这一问题。用户可以将一组相关命令编辑在同一个ASCII码命令中,运行时只需输入文件名,MATLAB就会自动按顺序执行文件中的命令。这类似于批处理文件。命令文件中的语句可以访问MATLAB工作区中的所有数据。在运行的过程中所产生的变量均是全局变量。这些变量一旦生成,就一直保存在内存空间中,除非用户将它们清除(如clear命令)。
如求数1,2,3,4,…,100的和。
在编辑器中写出程序如下:
s=0;
for n=1:100
s=s+n;
end
s
保存为exm0101(这是文件名),然后在命令行窗口中执行,即输入文件名:
>>exm0101
s=5050%这是程序运行的结果
2.M函数文件
M函数文件是另一种形式的M文件,可以有输入参数和返回输出参数,函数在自己的工作区中操作局部变量,它的第一句可执行语句是以function引导的定义语句。在函数文件中的变量都是局部变量,它们在函数执行过程中驻留在内存中,在函数执行结束时自动消失。函数文件不单单具有命令文件的功能,更重要的是它提供了与其他MATLAB函数和程序的接口,因此功能更强大。
新建M函数文件,只需在主界面的主页上点击“新建”按钮,选择“函数”选项,即可打开含有function引导的定义语句的M文件编辑窗口,如图1-18所示。
图1-18 M函数编辑/调试器窗口
MATLAB的M函数文件的组成:文件第一行是函数定义行,格式为:
function \[返回参数1,参数2,…\]= 函数名(输入参数1,参数2,…)
函数体
end
注意:第一行的有无,是区分命令文件与函数文件的重要标志;函数体包含所有函数程序代码,是函数的主体部分;函数文件保存的文件名应与用户定义的函数名一致。在命令行窗口中以固定格式调用函数。
例如,定义函数f(x,y)=x3+y3-3xy,并计算f(2,3)。
在编辑器中写出如下程序:
function f=exm0102(x,y) %函数名为exm0102,返回值为f
f=x.^3+y.^3-3*x.*y;%这是函数主体
end
保存为exm0102(这是文件名,与函数名一致),然后在命令行窗口中输入
>> exm0102(2,3)
ans =17%这是程序运行的结果
1.5.3 控制语句的编程
1.循环语句
MATLAB提供了两种循环方式:for…end循环和while…end循环。
1)for循环语句(计数循环方式),其调用格式如下:
for循环变量=初值:步长:终值
循环体
end
执行过程:将初值赋给循环变量,执行循环体;执行完一次循环之后,循环变量自增一个步长的值,然后再判断循环变量的值是否介于初值和终值之间,如果满足仍然执行循环体,直至不满足为止。
例如,利用for循环语句构造K=4阶希尔伯特矩阵A(即A矩阵的(m,n)元等于1/(m+n-1))的程序如下:
K=4;%定义矩阵的阶数K
for m=1:K%外层循环,循环变量是矩阵的行数m
for n=1:K%内层循环,循环变量是矩阵的列数n
A(m,n)=1/(m+n-1);%循环体语句
end
end
format rat %有理格式输出
A
输出结果:
A = 1 1/2 1/3 1/4
1/2 1/3 1/4 1/5
1/3 1/4 1/5 1/6
1/4 1/5 1/6 1/7
当然,MATLAB中已有专门的函数hilb(K)生成希尔伯特矩阵了,因此直接调用:
A=hilb(4) ;%生成4阶希尔伯特矩阵A
能达到程序的同样目的。
2)while循环语句(条件循环方式),其一般调用格式为:
while表达式
循环体
end
其执行过程为:若表达式的值为真,则执行循环体语句,执行后再判断表达式的值是否为真,直到表达式的值为假时跳出循环。
while语句一般用于事先不能确定循环次数的情况。例如,求1+11+2+11+2+3+…,程序如下:
k=0;s=0;d=inf;S=0; %变量赋初值
while d>0.001%循环开始,判定表达式“d>0.001”的真值
k=k+1;%循环体
s=s+k;
d=1/s;
S=S+d;
end%循环结束
N=k;
2.条件控制语句
1)if…else…end语句,其调用格式如下:
if表达式
语句体1;
else
语句体2;
end
其执行过程为:当表达式的值为真时,执行语句体1,否则执行语句体2;语句体1或语句体2执行后,再执行if语句的后继语句。
用if…else…end语句编写分段函数y(x)=x,x<-1
x3,-1≤x<1
e1-x,x≥1,根据所写函数计算函数值y(-2)、y(0.5)、y(2)。程序如下:
function y=exm0103 (x) %定义函数
n=length(x);
for k=1:n
if x(k)<-1%选择条件1
y(k)=x(k);%根据条件1为真选择执行的语句
elseif x(k)>=1%选择条件2
y(k)=exp(1-x(k));%根据条件2为真选择执行的语句
else
y(k)=x(k)^3;%条件1和2不真时选择执行的语句
end
end
在命令行窗口中输入:
>> exm0103(\[-2,0.5,2\])
输出x=-2,0.5,2时的函数值:
ans =
-2.0000 0.1250 0.3679
2)switch分支结构语句,其调用格式如下:
switch表达式
case表达式1
语句体1
case表达式2
语句体2
…
case表达式m
语句体m
otherwise
语句体m+1
end
其执行过程为:控制表达式的值与每一个case后面表达式的值比较,若与第k(k的取值为1~m)个case后面的表达式k的值相等,就执行语句体k;若都不相同,则执行otherwise下的语句体m+1。
以下是将百分制的学生成绩按满分、优秀、良好、及格与不及格五档次进行分类,应用switch分支结构语句实现的算法程序。
clear all; %清除所有变量
for k=1:10%成绩分组
a(k)={89+k};b(k)={79+k};c(k)={69+k};d(k)={59+k};
end;
c=\[d,c\];%成绩分组在60~79之间
A=cell(3,5);%定义元胞数组
A(1,:)={'Jack','Marry','Peter','Rose','Tom'};%学生姓名
A(2,:)={72,83,56,94,100};%学生成绩
%%以下是多分支选择结构%%
for k=1:5
switch A{2,k}%读取学生成绩并与case比较
case 100%成绩100分
r='满分';
case a%成绩90~99之间
r='优秀';
case b%成绩80~89之间
r='良好';
case c%成绩60~79之间
r='及格';
otherwise%成绩0~59之间
r='不及格';
end
A(3,k)={r};%记录每位学生成绩分档结果
end
A%输出学生成绩分档结果
程序输出结果:
A =
'Jack' 'Marry' 'Peter' 'Rose' 'Tom'
\[ 72\] \[ 83\] \[ 56\] \[ 94\] \[100\]
'及格' '良好' '不及格' '优秀' '满分'
3)其他流程控制语句。包括continue语句、break语句和return语句。
①continue语句用于for循环和while循环,其作用就是终止一次循环的执行,跳过循环体中所有剩余的未被执行的语句,去执行下一次循环。
②break语句也常用于for循环和while循环,其作用就是终止当前循环的执行,跳出循环体,去执行循环体外的下一行语句。
③return语句用于终止当前的命令序列,并返回到调用的函数或键盘,也用于终止keyboard方式。