「matlab学习笔记」MATLAB程序流程控制
中国大学MOOC 科学计算与MATLAB语言(点击此处跳转)
3.1 程序文件
脚本文件和函数文件
- 在MATLAB中程序文件的扩展名为.m,所以程序文件也称为M文件。
- 程序文件分为脚本文件和函数文件。
文件类型 | 说明 |
---|---|
脚本文件 | 可在命令行窗口直接执行的文件,也叫命令文件 |
函数文件 | 定义一个函数,不能直接执行,而必须以函数调用的方式来调用它 |
文件的建立
- 用edit命令创建文件。例如
>> edit test
- 用命令按钮创建文件。
%建立脚本文件f1.m
A=[1,2,3;4,5,6];
B=[1,2;3,4;5,6];
C=A*B
%在命令行窗口运行脚本文件
>> f1
C =
22 28
49 64
%建立函数文件f2.m
function C=f2(A,B)
C=A*B;
%在命令行窗口调用函数文件
>> A=[1,2,3;4,5,6];
>> B=[1,2;3,4;5,6];
>> C=f2(A,B)
C =
22 28
49 64
程序的三种基本结构分别是顺序结构、选择结构和循环结构。
3.2 顺序结构程序
MATLAB指令 | 功能 |
---|---|
input(提示信息,选项) | 数据的输入 |
disp(输出项) | 数据的输出 |
pause(延迟秒数) | 程序的暂停,若要强行中止程序的运行可使用Ctrl+C命令 |
%数据的输入
>> A=input('请输入变量A的值:');
请输入变量A的值:100
%数据的输出
>> s='Hello,World';
>> disp(s)
Hello,World
>> a=[1,2,3;4,5,6];
>> disp(a)
1 2 3
4 5 6
拓展:黄金分割点
黄金分割点源于黄金矩形。设矩形的长和宽分别为 x 和 y。把这个矩形裁掉一个边长为 y 的正方形后,剩下的小矩形的形状与原来的矩形完全一致,即矩形的长宽之比相同。
由黄金矩形的定义
解得
取
即
3.3 选择结构程序
用if语句实现选择结构
单分支if语句
if 条件 %关系运算或逻辑运算。
语句组 %可以是一条语句,也可以是多条语句。
end
1.当条件结果为标量时,非零表示条件成立,零表示条件不成立。
2.当条件结果为矩阵时,如果矩阵为非空,且不包含零元素,则条件成立,否则不成立。
例如,[1,2;0,4]表示条件时,条件不成立;[1,2;3,4]表示条件时,条件成立。
双分支if语句
if 条件
语句组1
else
语句组2
end
多分支if语句
if 条件1
语句组1
elseif 条件2
语句组2
…
elseif 条件m
语句组m
else
语句组n
end
%输入一个字符,若为大写字母,则输出其对应的小写字母
%若为小写字母,则输出其对应的大写字母
%若为数字字符则输出其对应数的平方
%若为其他字符则原样输出
c=input('请输入一个字符:','s');
if c>='A' && c<='Z'
disp(lower(c))
elseif c>='a' && c<='z'
disp(upper(c))
elseif c>='0' && c<='9'
disp(str2double(c)^2)
else
disp(c)
end
用switch语句实现选择结构
switch 表达式
case 结果表1
语句组1
case 结果表2
语句组2
…
case 结果表m
语句组m
otherwise
语句组n
end
注意:
1.switch表达式应该是一个其值可以列举的表达式。
例如,double不可列举,所以不能作为switch表达式的值
2.case结果表为switch表达式的取值,当取值有多个时,用单元数据表示。
3.当任意一个分支的语句执行完后,整个switch语句执行完毕(区别于C语言的switch语句)。
%输入一个英文单词,判断它是否以元音字母开头
%程序1
c=input('请输入一个单词:','s');
switch c(1)
case {'A','E','I','O','U','a','e','i','o','u'}
disp([c,'以元音字母开头']);
otherwise
disp([c,'以辅音字母开头']);
end
%程序2
c=input('请输入一个单词:','s');
if findstr(c(1),'AEIOUaeiou')>0
disp([c,'以元音字母开头']);
else
disp([c,'以辅音字母开头']);
end
1.switch表达式可用取整函数来保证其值的可列举性。
2.case结果表取值有多个时可用num2cell函数将数值矩阵转化为单元矩阵。
3.4 循环结构程序
用for语句实现循环结构
for 循环变量=表达式1:表达式2:表达式3 #初值:步长:终值
循环体语句
end
说明:
1.for语句针对向量的每一个元素执行一次循环体。
2.退出循环之后,循环变量的值就是向量中最后的元素值。
3.当向量为空时,循环体一次也不执行。例如1:-2:10
for语句更一般的格式为
for 循环变量=矩阵表达式
循环体语句
end
执行过程是依次将矩阵的各列元素赋给循环变量,然后执行循环体语句,直到各列元素处理完毕循环结束。
拓展:计算圆周率 \(\pi\)
(1)利用无穷级数展开式求 \(\pi\) 的近似值
%程序1
y=0;
g=-1;
n=input('n=?');
for i=1:n
g=-g;
y=y+g/(2*i-1);
end
pai=4*y
%程序2
%用向量计算方法写出来的程序更加简洁,也更加具有MATLAB的特点。
n=input('n=?');
x=1:2:(2*n-1);
y=(-1).^(2:n+1)./x;
pai=sum(y)*4
(2)利用定积分的近似值求 \(\pi\) 的近似值
a=0;
b=1;
n=input('n=?');
h=(b-a)/n;
x=a:h:b;
f=sqrt(1-x.*x);
s=[];
for k=1:n
s1=(f(k)+f(k+1))*h/2;
s=[s,s1];
end
pai=4*sum(s)
(3)利用蒙特卡洛法求 \(\pi\) 的近似值
s=0;
n=input('n=?');
for i=1:n
x=rand(1);
y=rand(1);
if x*x+y*y<=1
s=s+1;
end
end
pai=s/n*4
用while语句实现循环结构
while 条件 %循环判断条件
循环体语句
end
说明:
1.while语句多用于循环次数不确定的情况,而对于循环次数确定的情况,使用for语句更方便。
2.针对不同情况可以选择不同的循环语句,但从功能上讲两种循环语句可以相互替代。
语句 | 说明 |
---|---|
break | 跳出循环体,结束整个循环 |
continue | 结束本次循环,接着进行下一次是否执行循环的判断 |
循环的嵌套
- 如果一个循环结构的循环体又包括一个循环结构,就称为循环的嵌套,或称为多重循环结构。
- 处于内部的循环叫做内循环,处于外部的循环叫做外循环。
拓展:用筛选法求素数
筛选法求素数的基本思想:要找出 \(2\text{~}m\) 之间的全部素数,首先在 \(2\text{~}m\) 中划去 \(2\) 的倍数(不包括 \(2\)),然后划去 \(3\) 的倍数(不包括 \(3\)),由于 \(4\) 已被划去,再找 \(5\) 的倍数(不包括\(5\)),\(\cdots\),直到再划去不超过 \(𝑚\) 的倍数,剩下的数就都是素数了。
m=input('m=');
p=1:m;
p(1)=0;
for i=2:sqrt(m)
for j=2*i:i:m
p(j)=0;
end
end
n=find(p~=0);
p(n)
3.5 函数文件的定义与调用
函数文件的基本结构
function 输出形参表=函数名(输入形参表)
注释说明部分
函数体语句
- 当输出形参多于一个时,应该用方括号括起来,构成一个输出矩阵。
- 函数文件名通常由函数名再加上扩展名.m组成。当函数文件名与函数名不相同时,MATLAB将忽略函数名,调用时使用函数文件名。
- return语句表示结束函数的执行。通常,在函数文件中也可以不使用return语句,那么被调用函数执行完成后会自动返回。
函数调用
调用格式[输出实参表]=函数名(输入实参表)
%编写函数文件,求半径为r的圆的面积和周长
function [s,p]=fcircle(r)
s=pi*r*r;
p=2*pi*r;
%在MATLAB命令行窗口调用前面定义的fcircle函数
>> [s,p]=fcircle(10)
s =
314.1593
p =
62.8319
匿名函数
基本格式函数句柄变量=@(匿名函数输入参数) 匿名函数表达式
@ 为函数句柄的运算符
>> f=@(x,y) x^2+y^2
f =
@(x,y)x^2+y^2
>> f(3,4)
ans =
25
函数句柄变量=@函数名
函数名可以是内部函数或自定义函数
>> h=@sin 自定义函数
h =
@sin
>> h(pi/2)
ans =
1
3.6 函数的递归调用
名词 | 解释 |
---|---|
嵌套调用 | 在一个函数的定义中调用了其他函数 |
递归调用 | 一个函数调用它自身 |
拓展:Fibonacci数列
编写递归调用函数求Fibonacci数列的第 \(n\) 项,并验证 \(f_1^2+f_2^2+f_3^2+\cdots+f_n^2=f_n\times f_{n+1}\)
%首先建立函数文件ffib.m
function f=ffib(n)
if n>2
f=ffib(n-1)+ffib(n-2);
else
f=1;
end
%建立程序文件test.m
F=[];
for k=1:20
F=[F,ffib(k)*ffib(k)];
end
sum(F)
ffib(20)*ffib(21)
%运行结果
>> test
ans =
74049690
ans =
74049690
3.7 函数参数与变量的作用域
函数参数的可调性
预定义变量 | 含义 |
---|---|
nargin | 输入实参的个数 |
nargout | 输出实参的个数 |
%建立函数文件test.m
function fout=test(a,b,c)
if nargin==1
fout=a;
elseif nargin==2
fout=a+b;
elseif nargin==3
fout=(a*b*c)/2;
end
%运行结果
>> fout=test(2)
fout =
2
>> fout=test(2,3,2)
fout =
6
全局变量与局部变量
名词 | 解释 |
---|---|
局部变量 | 在程序中只在特定过程或函数中可以访问的变量 |
全局变量 | 所有的函数都可以对它进行存取和修改 |
全局变量定义格式global 变量名
%建立函数文件wad.m
function f=wad(x,y)
global ALPHA BETA
f=ALPHA*x+BETA*y;
%在命令行窗口中输入命令并得到输出结果
>> global ALPHA BETA
>> ALPHA=1;
>> BETA=2;
>> s=wad(1,2)
s =
5
说明:
1.前面所定义的变量都是局部变量。
2.在实际程序设计时,可以在所有需要调用全局变量的函数里定义全局变量。
3.如果要在工作空间中使用全局变量,也要在工作空间定义全局变量,这样就可以实现数据的共享。
友链
详细版笔记请跳转爆豆的博客