MATLAB系列04:循环结构

MATLAB系列04:循环结构

  • [4. 循环结构](#4. 循环结构)
    • [4.1 while循环](#4.1 while循环)
    • [4.2 for循环](#4.2 for循环)
      • [4.2.1 运算的细节](#4.2.1 运算的细节)
      • [4.2.2 break语句和continue语句](#4.2.2 break语句和continue语句)
      • [4.2.3 嵌套循环](#4.2.3 嵌套循环)
    • [4.3 逻辑数组和向量化](#4.3 逻辑数组和向量化)
      • [4.3.1 逻辑数组的重要性](#4.3.1 逻辑数组的重要性)
      • [4.3.2 用 if/else 结构和逻辑数组创建等式](#4.3.2 用 if/else 结构和逻辑数组创建等式)
    • [4.4 总结](#4.4 总结)

4. 循环结构

循环(loop)是一种 MATLAB 结构,它允许我们多次执行一系列的语句。循环结构有两种基本形式:while 循环和 for 循环。while的循环次数是不能确定的,for的循环次数是确定的。

4.1 while循环

while循环语句的基本形式:

matlab 复制代码
while expression
    ...
    ...
    ...
end

如果 expression 的值非零(true),程序将执行代码块,然后返回到 while 语句执行。如果 expression 的值仍然非零,那么程序将会再次执行代码。直到 expression 的值变为 0,这个重复过程结束。

4.2 for循环

for 循环结构是另一种循环结构,它以指定的数目重复地执行特定的语句块。 For 循环的形式如下

for index = expr
    Statement 1
    ...
    Statement n
end

其中 index 是循环变量(就是我们所熟知的循环次数), exp 是循环控制表达式。变量 index 读取的是数组 expr 的行数,然后程序执行循环体(loopbody),所以 expr 有多少列,循环体就循环多少次。 expr 经常用捷径表达式的方式,即 first:incr:last。

4.2.1 运算的细节

  1. 不是必须缩进 for 循环的循环体。即使所有语句都左对齐, MATLAB 程序也会识别出这个循环。但缩进循环体能增强代码的可读性。

  2. 在 for 循环中,我们不能随意修改循环变量。 循环变量常被用作计数器。

  3. 在循环前最好预分配数组大小。因为在循环中每拓展一次数组,都要经历以下步骤:第一步,创建一个新数组。 第二步,把旧数组的元素复制到新数组当中。第三步,把31 扩展的元素写入新数组。 第四步, 删除旧数组。 比较耗费时间。

  4. 用 for 循环和向量计算是非常常见的。在 MATLAB 中,用向量算法代替循环的算法的过程称之为向量化(vectorization)。向量化能够改进许多的 MATLAB 程序。示例:

    1. for循环

      matlab 复制代码
      for ii = 1:100
          square(ii) = ii ^2;
          square_root(ii) = ii ^ (1/2);
          cube_root(ii) = ii ^ (1/3);
      end
    2. 向量计算

      matlab 复制代码
      ii = 1:100;
      square = ii .^2;

4.2.2 break语句和continue语句

有两个附加语句可以控制 while 和 for 循环:break 和 continue 语句。 break 语句可以中止循环的执行和跳到 end 后面的第一句执行,而 continue 只中止本次循环,然后返回循环的顶部。

4.2.3 嵌套循环

一个循环完全出现在另一个循环当中,这种情况经常发生。如果一个循环完全出现在另一个循环当中,我们称这两个循环为带嵌套的循环。

4.3 逻辑数组和向量化

除了字符型和数字型的数据类型,还有第三种数据类型:逻辑型。示例:

matlab 复制代码
a = [1 2 3; 4 5 6; 7 8 9];
b = a > 5
whos
b =

  3×3 logical 数组

   0   0   0
   0   0   1
   1   1   1

  Name      Size            Bytes  Class      Attributes

  a         3x3                72  double               
  b         3x3                 9  logical 

我们还可以用 logical 函数给一个数组加上一个逻辑属性。如:

>> c=logical(a)

c =

  3×3 logical 数组

   1   1   1
   1   1   1
   1   1   1

一个数组的逻辑属性可以通过任何的数学运算去除。

>> c=c+0

c =

     1     1     1
     1     1     1
     1     1     1

>> whos c
  Name      Size            Bytes  Class     Attributes

  c         3x3                72  double     

4.3.1 逻辑数组的重要性

逻辑数组有一个重要的属性------它在算术运算中能提供一个屏蔽(mask)。屏蔽(mask)是指一个数组,它从另一个数组选择所需的元素参与运算。指定的运算只在选择的元素上执行,而不执行余下的元素。 例如,假设数组 a 和 b 的定义如上节所示。那么语句 a(b)=sqrt(a(b))会计算 a 中相应的元素的平方根,相应的元素是指与 b 数组中的非零元素相对应的数组 a 中的元素。其他元素保持不变。

matlab 复制代码
>> a

a =

     1     2     3
     4     5     6
     7     8     9

>> b

b =

  3×3 logical 数组

   0   0   0
   0   0   1
   1   1   1

>> a(b)=sqrt(a(b))

a =

    1.0000    2.0000    3.0000
    4.0000    5.0000    2.4495
    2.6458    2.8284    3.0000

4.3.2 用 if/else 结构和逻辑数组创建等式

逻辑数组经常被用来替代 for 循环中的 if/else 结构。例如,假设我们要计算一个二维数组中所有的大于 5 的元素的平方根,然后其余的数的平方。利用循环和选择结构的代码如下:

matlab 复制代码
for ii = 1:size(a,1)
    for jj = 1:size(a,2)
        if a(ii,jj) > 5
            a(ii,jj) = sqrt(a(ii,jj));
        else
            a(ii,jj) = a(ii,jj)^2;
        end
    end
end

用逻辑数组运算的代码如下:

matlab 复制代码
b = a > 5;
a(b) = sqrt(a(b));
a(~b) = a(~b) .^2;

4.4 总结

相关推荐
努力进修2 分钟前
“探索Java List的无限可能:从基础到高级应用“
java·开发语言·list
Ajiang28247353042 小时前
对于C++中stack和queue的认识以及priority_queue的模拟实现
开发语言·c++
盼海2 小时前
排序算法(五)--归并排序
数据结构·算法·排序算法
幽兰的天空2 小时前
Python 中的模式匹配:深入了解 match 语句
开发语言·python
Theodore_10225 小时前
4 设计模式原则之接口隔离原则
java·开发语言·设计模式·java-ee·接口隔离原则·javaee
----云烟----7 小时前
QT中QString类的各种使用
开发语言·qt
lsx2024067 小时前
SQL SELECT 语句:基础与进阶应用
开发语言
开心工作室_kaic7 小时前
ssm161基于web的资源共享平台的共享与开发+jsp(论文+源码)_kaic
java·开发语言·前端
向宇it7 小时前
【unity小技巧】unity 什么是反射?反射的作用?反射的使用场景?反射的缺点?常用的反射操作?反射常见示例
开发语言·游戏·unity·c#·游戏引擎
武子康8 小时前
Java-06 深入浅出 MyBatis - 一对一模型 SqlMapConfig 与 Mapper 详细讲解测试
java·开发语言·数据仓库·sql·mybatis·springboot·springcloud