MATLAB 之 M 文件和程序控制结构(顺序、选择、循环)

一、M 文件

  • M 文件是由若干 MATLAB 命令组合在一起构成的程序,其扩展名为 .m。它可以完成某些操作,也可以实现某种算法。实际上,MATLAB 提供的内部函数以及各种工具箱,都是利用 MATLAB 命令开发的 M 文件。

1. M 文件的建立与打开

  • M 文件是一个文本文件,它可以用任何文本编辑程序来建立和编辑,默认用 MATLAB 编辑器(Editor)打开并进行编辑。

1.1 建立新的 M 文件

  • 为建立新的 M 文件,我们需要先启动 MATLAB 编辑器,主要有以下三种办法。
  • (1) 在 MATLAB 选择主页项卡,在文件命令组中单击新建脚本命令按钮,屏幕上将出现 MATLAB 编辑器窗口。

在这里插入图片描述

  • 也可以在 MATLAB 主窗口选择主页选项卡,在文件命令组中单击新建命令按钮,再从其下拉菜单中选择脚本命令或函数命令。选择函数命令时,编辑窗口会自动给出以 function 开头的函数引导行。
  • MATLAB 编辑器是一个集编辑与调试功能于一体的工具环境。利用它不仅可以完成基本的程序编辑操作,还可以对 M 文件进行调试、发布。
  • MATLAB 编辑器界面包括功能区和文本编辑区两个部分。功能区有编辑器、发布和视图 3 个选项卡。 编辑器选项卡提供编辑、调试 M 文件的命令,发布选项卡提供管理文档标记和发布文档的命令,视图选项卡提供设置编辑区显示方式的命令。
  • MATLAB 编辑器的编辑区会以不同的颜色显示注释、关键词、字符串和一般的程序代码。
  • 启动 MATLAB 编辑器后,在文档窗口中输入程序,输入完毕后,在编辑器窗口选择编辑器选项卡,在文件命令组中单击保存命令按钮存盘。
  • 需要注意的是,M 文件存放的位置一般是 MATLAB 默认的工作目录,当然也可以是其他目录。如果是其他目录,则应该将该目录设定为当前目录。
  • (2) 在 MATLAB 命令行窗口输入如下命令:
    edit 文件名
  • 启动 MATLAB 编辑器后,输入 M 文件的内容并存盘。
  • (3) 在命令历史窗口选中一些命令(按住 Ctrl 键可同时选择多条命令),然后从右键快捷菜单中选择创建脚本命令,将会启动 MATLAB 编辑器,并在编辑区中加入所选中的命令。
  • 编辑完成后,在编辑器窗口选择编辑器选项卡,在文件命令组中单击保存命令按钮存盘。

1.2 打开已有的 M 文件

  • 打开已有的 M 文件有以下 3 种方法。
  • (1) 在 MATLAB 主窗口选择主页选项卡,在文件命令组中单击打开命令按钮,再从弹出的下拉菜单中选择打开命令,从打开对话框中选择所需打开的 M 文件,也可以从弹出的下拉菜单中选择最近使用的文件。
  • (2) 在 MATLAB 命令行窗口输入如下命令:
    edit 文件名
  • 则打开指定的 M 文件。
  • (3) 在当前文件夹窗口双击要打开的 M 文件,则打开该 M 文件。

2. M 文件的分类

  • 在 MATLAB 中,M 文件有两种类型:脚本(Script)文件和函数(Function)文件。
  • 脚本文件是将可执行程序语句放入 M 文件中,就像在命令行窗口那样,按其语句顺序及逻辑关系执行,可以理解为一般的可执行程序,脚本文件也叫命令文件。
  • 函数文件一般是声明一个函数,方便以后操作中的调用。
  • 脚本文件和函数文件的扩展名均为 .m,但其主要区别如下。
  • (1) 脚本文件没有输入参数,也不返回输出参数,而函数文件可以带输入参数,也可返回输出参数。
  • (2) 脚本文件对 MATLAB 工作空间中的变量进行操作,文件中所有命令的执行结果也完全返回到工作空间中,而函数文件中定义的变量为局部变量,当函数文件执行完毕时,这些变量被清除。
  • (3) 脚本文件可以直接运行,在 MATLAB 命令行窗口输入脚本文件的名字,就会顺序执行脚本文件中的命令,而函数文件不能直接运行,要以函数调用的方式来调用它。
  • 例如,我们建立一个脚本文件将变量 a、b 的值互换,然后运行该脚本文件。
  • 程序 1:
  • 首先,我们建立脚本文件并以文件名 exch.m 存盘。
clear;
a=1:10;
b=[11,12,13,14;15,16,17,18];
c=a;a=b;b=c;
a
b
  • 然后,我们在 MATLAB 的命令行窗口中输入 exch,将会执行该脚本文件。
>> exch

a =

    11    12    13    14
    15    16    17    18


b =

     1     2     3     4     5     6     7     8     9    10

  • 执行该脚本文件时,不用输入参数,也没有输出参数,文件自身建立需要的变量。当文件执行完毕后,可以用命令 whos 查看工作空间中的变量,这时会发现 a、b、c 仍然保留在工作空间中。
  • 程序 2:
  • 首先,我们建立函数文件 fexch.m。
function [a,b]=exch(a,b)
c=a;c=b;b=c;
end
  • 然后在 MATLAB 的命令行窗口中调用该函数文件。
>> clear;
>> x=[1:10];
>> y=[11:14;15:18];
>> [x,y]=fexch(x,y)

x =

    11    12    13    14
    15    16    17    18


y =

     1     2     3     4     5     6     7     8     9    10

  • 调用该函数文件时,既有输入参数,又有输出参数。当函数调用完毕后,可以用命令 whos 查看工作空间中的变量。这时会发现函数参数 a、b、c 未被保留在工作空间中,而 x、y 仍保留在工作空间中。

二、 程序控制之顺序结构

  • 顺序结构是指按照程序中语句的排列顺序依次执行,直到程序的最后一个语句为止。
  • 程序实现通常包括数据输入、数据处理和数据输出 3 个操作步骤,其中输入输出反映了程序的交互性,一般是一个程序必需的步骤,而数据处理是指要进行的操作与运算,根据解决的问题不同而需要使用不同的语句来实现。

1. 数据的输入

  • 在程序中如果需要从键盘输入数据,可以使用 input 函数来实现,其调用格式如下:
A=input(提示信息);
  • 其中,提示信息是一个字符串,用于提示用户输入什么样的数据。例如,从键盘输入 A 矩阵,可以采用下面的语句来完成。
>> A=input('输入 A 矩阵:');
  • 执行该语句时,首先在屏幕上显示提示信息输入 A 矩阵:,然后等待用户从键盘按 MATLAB 规定的格式输入 A 矩阵的值。
  • 如果要输入一个字符串,则字符串前后要加单引号,以界定字符串的开始与结束。例如:
>> A=input('What''s your name?');
What's your name?'zhang san'
  • 在提示信息 What’'s your name? 后输入 ‘zhang san’,输入的字符串加了引号。
  • 如果要输入一个字符串,也可以在调用 input 函数时使用 s 选项。例如:
>> A=input('What''s your name?','s');
What's your name?zhang san
  • 这时在提示信息 What’'s your name? 后输入 zhang san,输入的字符串不需要加引号。

2. 数据的输出

  • MATLAB 提供的输出函数主要有 disp 函数,其调用格式如下:
disp(输出项)
  • 其中,输出项既可以是字符串,也可以是矩阵。例如:
>> A='YAN ZI 22';
>> disp(A)
YAN ZI 22
  • 又例如:
>> A=[1,2,3;4,5,6;7,8,9];
>> disp(A)
     1     2     3
     4     5     6
     7     8     9
  • 这里需要注意的是,和前面介绍的矩阵显示方式不同,用 disp 函数显示矩阵时将不会显示矩阵的名字,而且其输出格式更紧凑,不会存在没有意义的空行。
  • 例如,我们求解一元二次方程 a x 2 + b x + c = 0 ax^{2}+bx+c=0 ax2+bx+c=0 的根。
  • 由于 MATLAB 能进行复数运算,所以我们不需要判断方程的判别式,可以直接根据求根公式求根。
a=input('a=?');
b=input('b=?');
c=input('c=?');
d=b*b-4*a*c;
x=[(-b+sqrt(d))/(2*a),(-b-sqrt(d))/(2*a)];
disp(['x1=',num2str(x(1)),', x2=',num2str(x(2))]);
  • 程序运行结果如下:
a=? 4
b=? 78
c=? 54
x1=-0.7188, x2=-18.7812
  • 再一次运行程序后,运行结果如下:
a=? 23
b=? -6
c=? 54
x1=0.13043+1.5267i, x2=0.13043-1.5267i

3. 程序的暂停

  • 当程序运行时,为了查看程序的中间结果或者观看输出的图形,有时需要暂停程序的执行。这时可以使用 pause 函数,其调用格式如下:
pause (延迟秒数)
  • 如果省略延迟时间,直接使用 pause,则将暂停程序,直到用户按任一键后程序继续执行。若在程序的执行过程中要强行中止程序的运行可按 Ctrl+C 键。

三、程序控制之选择结构

  • 选择结构又称为分支结构,它根据给定的条件是否成立,决定程序的运行路线,在不同的条件下,执行不同的操作。
  • MATLAB 用于实现选择结构的语句有 if 语句、switch 语句和 try 语句。

1. if 语句

  • 在 MATLAB 中,if 语句有以下 3 种格式。
  • (1) 单分支 if 语句。
  • 其语句格式如下:
if 条件
   语句组
end
  • 其中,条件一般用关系运算或逻辑运算来表示,其结果是一个标量或矩阵。当结果矩阵非空,且不包含零元素时,该条件成立,否则不成立。
  • 例如,当条件为 [1, 2; 3, 4] 时,判定条件成立。当条件为 [] 或 [1, 2; 0, 4] 时,判定条件不成立。
  • MATLAB 中建议条件尽量使用标量,条件的结果为非零时,表示条件成立,零表示条件不成立。当对标量进行逻辑与运算或者逻辑或运算时,其运算符可以采用 && 和 ||。
  • 当条件成立时,则执行语句组,执行完之后继续执行 if 语句后面的语句,若条件不成立,则直接执行if语句后面的语句。例如,当 x 是整数矩阵时,输出 x 的值,语句如下:
if fix(x)==x
    disp(x);
end
  • (2) 双分支 if 语句。
  • 其语句格式如下:
if 条件
   语句组 1
else
   语句组 2
end
  • 当条件成立时,执行语句组 1,否则执行语句组 2,语句组 1 或语句组 2 执行后,再执行 if 语句后面的语句。
  • 例如,我们计算分段函数的值。 y = { c o s ( x + 1 ) + x 2 + 1 , x = 10 x x + x , x ≠ 10 y=\left\{\begin{matrix}cos\left ( x+1 \right )+\sqrt{x^{2}+1},x=10 \\x\sqrt{x+\sqrt{x} } ,x\ne 10 \end{matrix}\right. y={ cos(x+1)+x2+1 x=10xx+x x=10
  • 这是一个具有两个分支的分段函数,为了求函数值,可以采用双分支结构来实现。程序如下:
x=input('请输入 x 得到值:');
if x==10
    y=cos(x+1)+sqrt(x*x+1);
else
    y=x*sqrt(x+sqrt(x));
end
y
  • 可以不用第一个 if 语句,而直接求函数值即可,改用以下程序实现。
x=input('请输入 x 得到值:');
y=cos(x+1)+sqrt(x*x+1);
if x=~10
    y=x*sqrt(x+sqrt(x));
end
y
  • (3) 多分支 if 语句。
  • 其语句格式如下:
if 条件 1
   语句组 1
elseif 条件 2
   语句组 2
   …
elseif 条件 m
   语句组 m
else 
   语句组 n
end
  • 语句中的 elseif 部分和 else 部分是可选的,只有前面的条件不成立,才会进行后面的条件判断。
    在这里插入图片描述
  • 例如,我们输入一个字符,若为大写字母,则输出其对应的小写字母;若为小写字母,则输出其对应的大写字母;若为数字字符则输出其对应数的平方,若为其他字符则原样输出。
  • 判断分为 4 个分支,可以用 4 个单分支结构实现,也可以用多分支 if 选择结构实现。关于字符的处理,用 lower 函数将大写字母转换成相应的小写字母,用 upper 函数将小写字母转换成相应的大写字母,用 str2double 函数将字符串转换为数值。程序如下:
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
  • 运行结果如下:
请输入一个字符:R
r
请输入一个字符:b
B
请输入一个字符:7
     49
请输入一个字符:*
*

2. switch 语句

  • switch 语句根据表达式的取值不同,分别执行不同的语句,其语句格式如下:
switch 表达式
   case 结果表 1
      语句组 1
   case 结果表 2
      语句组 2case 结果表 m
      语句组 m
   otherwise         
      语句组 n
end
  • 首先计算表达式的值,当表达式的值等于结果表 1 中的值时,执行语句组 1,当表达式的值等于结果表 2 中的值时,执行语句组 2,……,当表达式的值等于结果表 m 中的值时,执行语句组 m,当表达式的值不等于 case 所列的所有结果表的值时,执行语句组 n。
  • 当任意一个分支的语句执行完后,直接执行 switch 子句后面的语句。

在这里插入图片描述

  • switch 子句后面的表达式应为一个标量或一个字符串,case 子句后面的结果不仅可以为一个标量或一个字符串,还可以为一个将多个结果用大括号括起来的单元数据。
  • 如果 case 子句后面的结果表为一个单元数据,则表达式的值等于该单元数据中的某个元素时,执行相应的语句组。
  • 例如,某商场对商品实行打折销售,标准如下(商品价格用 price 来表示)。我们输入所售商品的价格,求其实际销售价格。
价格 折扣
price<200 没有折扣
200≤price<500 3% 折扣
500≤price<1000 5% 折扣
1000≤price<2500 8% 折扣
2500≤price<5000 10% 折扣
5000≤price 14% 折扣
  • 根据不同价格区间的折扣标准,switch 表达式写成 fix(price/100),case 结果表为相应价格区间内该表达式的取值,取值有多个时写成将多个结果用大括号括起来的单元数据。程序如下:
price=input('请输入商品价格');
switch fix(price/100)
    case {
    
    0,1}  %价格小于 200
        rate=0;
    case {
    
    2,3,4}  %价格大于或等于 200 但小于 500
        rate=3/100;
    case num2cell(5:9)  %价格大于或等于 500 但小于 1000
        rate=5/100;
    case num2cell(10:24)  %价格大于或等于 1000 但小于 2500
        rate=8/100;
    case num2cell(25:49)  %价格大于或等于 2500 但小于 5000
        rate=10/100;
    otherwise  %价格大于或等于 5000
        rate=14/100;
end
price=price*(1-rate)  %输出商品实际销售价格
  • 程序中的 num2cell 函数是将数值矩阵转化为单位矩阵,num2cell(5:9) 等价于{5,6,7,8,9}。运行结果如下:
请输入商品价格2000

price =

        1840

3. try 语句

  • try 语句是一种试探性执行语句,提供了一种捕获错误的机制,其语句格式如下:
try 
   语句组 1
catch     
   语句组 2
end
  • try 语句先试探性执行语句组 1,如果语句组 1 在执行过程中出现错误,则将错误信息赋给预定义变量 lasterr,并转去执行语句组 2。如果不出错,则转去执行 end 后面的语句。
  • 例如,矩阵乘法运算要求两矩阵的维数相容,否则会出错。先求两矩阵的乘积,若出错,则提示错误信息。
  • 程序如下:
A=input('请输入 A 矩阵:');
B=input('请输入 B 矩阵:');
try
    C=A*B
catch
    lasterr
end
  • 程序运行结果如下:
请输入 A 矩阵:[1,2,3;4,5,6]
请输入 B 矩阵:[1,2;3,4;5,6]

C =

    22    28
    49    64

  • 再运行一次程序,运行结果如下:
请输入 A 矩阵:[1,2,3;4,5,6]
请输入 B 矩阵:[7,8,9;10,11,12]

ans =

    '错误使用  * 
     用于矩阵乘法的维度不正确。请检查并确保第一个矩阵中的列数与第二个矩阵中的行数匹配。要单独对矩阵的每个元素进行运算,请使用 TIMES (.*)执行按元素相乘。'

四、程序控制之循环结构

  • 循环结构的基本思想是重复,即利用计算机运算速度快以及能进行逻辑控制的特点,重复执行某些语句,以满足大量的计算要求。
  • 虽然每次循环执行的语句相同,但语句中一些变量的值是变化的,而且当循环到一定次数或满足条件后能结束循环。
  • MATLAB 提供了两种实现循环结构的语句:for 语句和 while 语句。

1. for 语句

  • 一般情况下,对于能事先确定循环次数的循环结构,使用 for 语句是比较方便的。其语法格式如下:
for 循环变量=表达式1:表达式2:表达式3
   循环体语句
end
  • 其中,表达式1:表达式2:表达式3 是一个冒号表达式,将产生一个行向量,3 个表达式分别代表初值、步长和终值。当步长为 1 时,表达式2 可以省略。
  • 对于 for 语句,首先计算 3 个冒号表达式,形成一个行向量,再将向量中的元素逐个赋给循环变量,每次赋值后都执行一次循环体语句,当向量的元素都被使用完时,结束 for 语句的执行,而继续执行 for 语句后面的语句。

在这里插入图片描述

  • 关于 for 语句的执行,还需要注意以下几点。
  • (1) for 语句针对向量的每一个元素执行一次循环体,循环的次数就是向量中元素的个数,也可以针对任意向量。
  • (2) 可以在 for 循环体中修改循环变量的值,但当程序执行流程再次回到循环开始时,就会自动被设成向量的下一个元素。
  • (3) for 语句中的 3 个表达式只在循环开始时计算一次, 也就是说,向量元素一旦确定将不会再改变。如果在表达式中含有变量,即便在循环体中改变变量的值,向量的元素也不改变。
  • (4) 推出循环后,循环变量的值就是向量中最后的元素值。
  • (5) 当向量为空时,循环体一次也不执行。
  • 例如,一个 3 位整数各位数字的立方和等于该数本身则称该数为水仙花数。输出全部水仙花数。
  • 首先考虑如何判断水仙花数,关键的一步是先分别求 3 位整数的个位、十位、百位数字,再根据条件判断该数是否为水仙花数。然后利用 for 语句穷举全部 3 位整数。程序如下:
shu=[]  %用于存放结果,先赋空值
for m=100:1:999
    m1=fix(m/100);  %求 m 的百位数字
    m2=rem(fix(m/10),10);  %求 m 的十位数字
    m3=rem(m,10);  %求 m 的个位数字
    if m==m1*m1*m1+m2*m2*m2+m3*m3*m3
        shu=[shu,m];  %存入结构
    end
end
disp(shu)
  • 程序运行结果如下:
shu =

     []

   153   370   371   407
   
  • 例如,已知 y = 1 + 1 2 2 + 1 3 2 + … + 1 n 2 y=1+\frac{1}{2^{2} } +\frac{1}{3^{2} }+…+\frac{1}{n^{2} } y=1+221+321++n21,当 n = 100 n=100 n=100 时,求 y y y 的值。
  • 这是求 n n n 个数之和的累加问题,可用以下递推式来描述: y i = y i − 1 + f i y_{i} =y_{i-1}+f_{i} yi=yi1+fi
  • 其中, y 0 = 0 y_{0}=0 y0=0,即第 i i i 此的累加和 y y y 等于第 i − 1 i-1 i1 次的累加和加上本次的累加项 f f f,可用以下赋值语句来实现。 y = y + f y=y+f y=y+f
  • 其中累加项 f f f 可用以下赋值语句来实现。 f = 1 / ( i ∗ i ) f=1/(i*i) f=1/(ii)
  • 整体程序如下:
y=0;
n=100;
for i=1:1:n
    y=y+1/(i*i);
end
y
  • 程序运行结果如下:
y =

    1.6350

  • 例如,设 f ( x ) = e − 0.5 x sin ⁡ ( x + π 6 ) f(x)=e^{-0.5x}\sin(x+\frac{\pi }{6} ) f(x)=e0.5xsin(x+6π),求 s = ∫ 0 3 π f ( x ) d x s=\int_{0}^{3\pi } f(x)dx s=03πf(x)dx 的值。
  • 求函数 f ( x ) f(x) f(x) [ a , b ] [a,b] [a,b] 上的定积分,其几何意义就是求曲线 y = f ( x ) y=f(x) y=f(x) 与直线 x = a x=a x=a x = b x=b x=b y = 0 y=0 y=0 所围成的曲边梯形的面积。
  • 为了求得曲边梯形面积,先将积分区间 [ a , b ] [a,b] [a,b] 分成 n n n 等份,每个区间的宽度为 h = ( b − a ) / n h=(b-a)/n h=(ba)/n,对应地将曲边梯形分成 n n n 等份,每个小部分即是一个小曲边梯形。近似求出每个小曲边梯形面积,然后将 n n n 个小曲边梯形的面积加起来,就得到总面积,即定积分的近似值。程序如下:
a=0;
b=3*pi;
n=1000;
h=(b-a)/n;
x=a;
s=0;
f0=exp(-0.5*x)*sin(x+pi/6);
for i=1:n
    x=x+h;  %下一个 x 坐标
    f1=exp(-0.5*x)*sin(x+pi/6);  %求新的函数值
    s=s+(f0+f1)*h/2;  %求小梯形面积并累加
    f0=f1;  %更新函数值
end
s
  • 运行结果如下:
s =

    0.9008

  • 上述程序来源于传统的编程思想。也可以利用向量运算,从而使得程序更加简洁,更加具有 MATLAB 的特点。程序如下:
a=0;
b=3*pi;
n=1000;
h=(b-a)/n;
x=a:h:b;  %生成自变量向量 x
f=exp(-0.5*x).*sin(x+pi/6);  %求函数值向量 f
for i=1:n
    s(i)=(f(i)+f(i+1))*h/2;  %求各个小梯形面积,组成面积向量 f
end
s=sum(s)  %求面积向量 s 元素之和
  • 程序中 x、f、 s 均为向量,f 的元素为各个 x 点的函数值,s 的元素分别为 n 个梯形的面积,s 各元素之和即定积分近似值。事实上,MATLAB 提供了有关数值积分的标准函数,实际应用中可直接调用这些函数求数值积分。

2. while 语句

  • while 语句就是通过判断循环条件是否满足来决定是否继续循环的一种循环控制语句,也称为条件循环语句。它的特点是先判断循环条件,条件满足时执行循环。
  • while 语句的一般格式如下:
while 条件
   循环体语句
end
  • 其执行过程为,若条件成立,则执行循环体语句,执行后再判断条件是否成立,如果不成立则跳出循环。

在这里插入图片描述

  • 例如,从键盘中输入若干个数,当输入 0 时结束输入,求这些数的平均值和它们之和。
  • 这是一个典型的条件循环问题,用 while 语句实现。程序如下:
sum=0;
n=0;
x=input('Enter a number(end in 0):');
while x~=0
    sum=sum+x;
    n=n+1;
    x=input('Enter a number(end in 0):');
end
if n>0
    sum
    mean=sum/n
end
  • 运行结果如下:
Enter a number(end in 0)67
Enter a number(end in 0)89
Enter a number(end in 0)93
Enter a number(end in 0)70
Enter a number(end in 0)0

sum =

   319


mean =

   79.7500

  • 例如,根据矩阵指数的幂级数展开式求矩阵指数。 e X = I + X + X 2 2 ! + X 3 3 ! + … + X n n ! + … e^{X}=I+X+\frac{X^{2}}{2!}+\frac{X^{3}}{3!}+…+\frac{X^{n}}{n!}+… eX=I+X+2!X2+3!X3++n!Xn+
  • X X X 是给定的矩阵, E E E 是矩阵指数函数值, F F F 是展开式的项, n n n 是项数,循环一直进行到 F F F 很小,以至于 F F F 值加在 E E E 上对 E E E 的值影响不大时为止。
  • 为了判断 F F F 是否很小,可利用求矩阵范数的函数 norm(F,1) 来计算。所以当 norm(F,1)=0 时,认为 F F F 很小,应退出循环的执行。程序如下:
X=input('Enter X:');
E=zeros(size(X));  %生成与 X 同样大小的零矩阵
F=eye(size(X));  %生成与 X 同样大小的单位矩阵
n=1;
while norm(F,1)>0
    E=E+F;  %实现累加
    F=F*X/n;  %求累加项
    n=n+1;
end
E
expm(X)  %调用 MATLAB 矩阵指数函数求矩阵指数
  • 运行结果如下:
Enter X:[0.5,2,0;1,-1,-0.5;0.9,1,0.75]

E =

    2.6126    2.0579   -0.6376
    0.7420    0.7504   -0.5942
    2.5678    2.3359    1.5549


ans =

    2.6126    2.0579   -0.6376
    0.7420    0.7504   -0.5942
    2.5678    2.3359    1.5549

  • 运行结果表明,程序运行结果与 MATLAB 矩阵指数函数 expm(X) 的结果一致。

3. break 语句和 continue 语句

  • 与循环结构相关的语句还有 break 语句和 continue 语句,它们一般与 if 语句配合使用。
  • break 语句用于终止循环的执行。当在循环体内执行到该语句时,程序将跳出循环,继续执行循环语句的下一语句。
  • continue 语句控制跳过循环体中的某些语句。当在循环体内执行到该语句时,程序将跳过循环体中所有剩下的语句,继续下一次循环。
  • 例如,求 [ 100 , 200 ] [100, 200] [100,200] 之间第一个能被 21 整除的整数。
  • 程序如下:
for n=100:200
    if(rem(n,21)~=0)
        continue
    end
    n
    break
end
  • 运行结果如下:
n =

   105

  • 当 n 不能被 21 整除时,执行 continue 语句直接进行下一次循环。一旦发现 n 能被 21 整除,执行 break 语句跳出循环体。

4. 循环的嵌套

  • 如果一个循环结构的循环体又包括一个 循环结构,就称为循环的嵌套,或称为多重循环结构。
  • 实现多重循环结构仍用前面介绍的循环语句。因为任一循环语句的循环体部分都可以包含另一个循环语句,这种循环语句的嵌套为实现多重循环提供了方便。
  • 多重循环的嵌套层数可以是任意的,可以按照嵌套层数,分别叫做二重循环、三重循环等。处于内部的循环叫做内循环,处于外部的循环叫做外循环。
  • 例如,若一个数等于它的各个真因子之和,则称该数为完数,如 6 = 1 + 2 + 3 6=1+2+3 6=1+2+3,所以 6 是完数。求 [ 1 , 500 ] [1, 500] [1,500] 之间的全部完数。
  • 对于此题,我们先考虑单个数是否为完数的问题,根据定义要用到一个循环结构。再求指定范围内的全部完数,在前一循环结构基础上,再嵌套一个循环结构。程序如下:
for m=1:500
    s=0;
    for k=1:m/2
        if rem(m,k)==0
            s=s+k;
        end
    end
    if m==s
        disp(m);
    end
end
  • 运行结果如下:
    6

    28

   496

  • 例如,用筛选法求出某自然数范围内的全部素数。
  • 素数是大于 1,且除了 1 和它本身以外,不能被其他任何整数所整除的整数。
  • 用筛选法求素数的基本思想是,要找出 2~m 之间的全部素数,首先在 2~m 中划去 2 的倍数(不包括 2),然后划去 3 的倍数(不包括 3),由于 4 已被划去,再找 5 的倍数(不包括 5),…,直到再划去不超过 m \sqrt{m} m 的数的倍数,剩下的数都是素数。程序如下:
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)
  • 外循环控制 i i i 从 2 到 m \sqrt{m} m 变化,内循环在 p p p 中划去 i i i 的倍数(不包括 i i i), p p p 中剩下的都是素数。find 函数找出 p p p 非 0 元素的下标并赋给变量 n n n (注意, n n n 为向量)。

猜你喜欢

转载自blog.csdn.net/weixin_45891612/article/details/130653645