「matlab学习笔记」MATLAB程序流程控制

中国大学MOOC 科学计算与MATLAB语言(点击此处跳转)

MATLAB官方文档(点击此处跳转)

3.1 程序文件

脚本文件和函数文件

  • 在MATLAB中程序文件的扩展名为.m,所以程序文件也称为M文件。
  • 程序文件分为脚本文件和函数文件。
文件类型 说明
脚本文件 可在命令行窗口直接执行的文件,也叫命令文件
函数文件 定义一个函数,不能直接执行,而必须以函数调用的方式来调用它

文件的建立

  • 用edit命令创建文件。例如>> edit test
  • 用命令按钮创建文件。

image

%建立脚本文件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 的正方形后,剩下的小矩形的形状与原来的矩形完全一致,即矩形的长宽之比相同。

image

由黄金矩形的定义

\[\cfrac {x}{y}=\cfrac {y}{x-y} \implies x^2-xy-y^2=0 \]

解得

\[x=\cfrac {y\pm y\sqrt{5}}{2} \implies \cfrac {x}{y}=\cfrac {1\pm\sqrt{5}}{2} \]

\[\cfrac {x}{y}=\cfrac {1+\sqrt{5}}{2} \implies y=\cfrac{\sqrt{5}-1}{2}x \]

\[y=0.618x \]

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

image

说明:
1.for语句针对向量的每一个元素执行一次循环体。
2.退出循环之后,循环变量的值就是向量中最后的元素值。
3.当向量为空时,循环体一次也不执行。例如1:-2:10

for语句更一般的格式为

for 循环变量=矩阵表达式
    循环体语句
end

执行过程是依次将矩阵的各列元素赋给循环变量,然后执行循环体语句,直到各列元素处理完毕循环结束。

拓展:计算圆周率 \(\pi\)

(1)利用无穷级数展开式求 \(\pi\) 的近似值

\[\cfrac {\pi}{4}=1-\cfrac {1}{3}+\cfrac {1}{5}-\cfrac {1}{7}+\cdots+(-1)^{n+1}\cfrac {1}{2n-1} \]

%程序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\) 的近似值

设 $f(x)=\sqrt{1-x^2}{\rm d}x$,求 $\cfrac {\pi}{4}=\int_0^1 {f(x)}\,{\rm d}x$,即求四分之一单位圆的面积。
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\) 的近似值

在正方形内随机投点,设点落在圆内的概率为 $p=\cfrac {\pi}{4}=\cfrac {落在圆内的点数}{所投点的总数}$。
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数列

\[ f_n = \begin{cases} 1, & \text{$n$ = 1, 2} \\[2ex] f_{n-1}+f_{n-2}, & \text{$n$ > 2} \end{cases} \]

编写递归调用函数求Fibonacci数列的第 \(n\) 项,并验证 \(f_1^2+f_2^2+f_3^2+\cdots+f_n^2=f_n\times f_{n+1}\)

image

%首先建立函数文件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.如果要在工作空间中使用全局变量,也要在工作空间定义全局变量,这样就可以实现数据的共享。

友链

详细版笔记请跳转爆豆的博客

【Matlab学习1.1】操作界面、搜索路径

posted @ 2023-02-02 01:17  恺雯  阅读(225)  评论(0编辑  收藏  举报