• MATLAB程序设计之循环结构入门详解


    一、引言

    Matlab可以类似C/C++语言或者Python语言一样可以编写程序以完成某些功能。Matlab程序包含三大程序结构,分别是顺序结构、选择结构和循环结构。本文主要给出了Matlab程序的循环结构的语法规则及相关的Demo。Matlab程序结构之循环结构主要包括for循环和while循环。下面将逐一进行讲解。

    二、for…end循环结构

    1.语法:
    for…end循环用于事先已知循环次数的情形,其语法如下:

    for 循环变量 = 起始值:步长:终止值
    			循环体
    end
    
    • 1
    • 2
    • 3

    2.注意事项
    (1)步长的缺省值是1。步长可以在正实数或负实数范围内任意指定,对于正数,循环变量的值大于终止值时,循环结束;对于负数,循环变量的值小于终止值时,循环结束;
    (2)for和end语句中间的所有语句会自动缩进;
    (3)for循环可以嵌套使用;
    (4)不能通过内部对循环变量重新赋值而进行反复的循环或停止循环;
    (5)循环中可以使用break或者continue中断或改变循环,其中
    – break用来实现:跳出本层循环体
    – continue用来实现:结束本次循环而进入当前层循环的下一次循环
    3.for循环示例程序
    Demo 1:一个三位整数各位数字的立方和等于该数本身则称该数为水仙花数。输出全部水仙花数。
    参考代码:

    clear all
    clc
    tic%开始计时
    for m = 100 : 999
        m1 = fix( m / 100 );           
        m2 = rem( fix( m / 10 ), 10 );     
        m3 = rem( m, 10 ); 
        if m == m1^3 + m2^3 + m3^3
            disp( [ num2str( m ) ] )
        end
    end
    toc%计时结束,显示程序的运行时间
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    运行结果:

    153
    370
    371
    407
    时间已过 0.038234 秒。
    
    • 1
    • 2
    • 3
    • 4
    • 5

    也可以使用如下代码来实现,即通过数组来实现,并使用了数组元素过滤的手段从数组中提取水仙花数。避免了使用循环。

    clear all
    clc
    tic%开始计时
    Arr = [ 100 : 999 ];
    Arr100 = fix( Arr / 100);
    Arr10  = rem( fix( Arr / 10), 10 );
    Arr1   = rem( Arr, 10 );
    ArrN   = Arr100.^3 + Arr10.^3 + Arr1.^3;
    data   = Arr .* ( Arr == ArrN );%获取数组Arr中的水仙花数,非水仙花数设置为0
    Arr( find( data > 0 ) )%把水仙花数单独显示出来
    toc%计时结束,显示程序的运行时间
    format compact
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    运行结果:

    ans =
       153   370   371   407
    时间已过 0.004718 秒。
    
    • 1
    • 2
    • 3

    提示:通过本例可以发现,有些循环也可以通过数组来实现。而且通过数组来实现可以有效提高运行速度。另外运行时间会根据系统的状态而得到不同的数据!!!

    Demo 2:若一个数等于它的各个真因子之和,则称该数为完数,如6=1+2+3,所以6是完数。求1到10000之间的全部完数。
    参考代码:

    clear all
    clc
    for m = 1 : 10000
        s = 0; 
        for k = 1 : m/2
            if rem( m, k ) == 0
                s = s + k;
            end
        end
        if m == s
            disp( [ '完数:', num2str( m ) ] );
        end
    end
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    运行结果:
    完数:6
    完数:28
    完数:496
    完数:8128

    **Demo 3**:把一个矩阵中各列元素改成列元素乘以列编号的平方。
    此例子涉及了循环变量为矩阵的情形。如果循环变量等于一个矩阵,执行过程是依次将矩阵的各列元素赋给循环变量,然后执行循环体语句,直至各列元素处理完毕。
    参考代码:
    ```matlab
    clear all
    clc
    Arr = [ 1 : 2 : 6; 3 : 5; 1 : 3 ]
    A = zeros( size(Arr) );
    k = 1;
    for i = Arr
        A( :, k ) = i * k^2;
        k = k + 1;
    end
    A
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    运行结果:

    Arr =
         1     3     5
         3     4     5
         1     2     3
    A =
         1    12    45
         3    16    45
         1     8    27
         ```
    **Demo 4**:在1到1000之间找前两个完数(break的例子)。
    break的功能是结束本层循环。
    参考代码:
    ```matlab
    clear all
    clc
    count = 0;%计算器,记录完数的个数
    for m = 1 : 10000
        s = 0; 
        for k = 1 : m/2
            if rem( m, k ) == 0
                s = s + k;
            end
        end
        if m == s
            disp( [ '完数:', num2str( m ) ] );
            count = count + 1;
            if count == 2 %当计数器等于2的时候,结束循环
                break;
            end
        end
    end
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    Demo5: 把一个数组中的负数改成其平方,正数保持不变。(continue的例子)
    continue的用法与C/C++语言类似,即满足给定的条件后,跳过continue后面的代码而进入下一次循环。
    参考代码:

    clear all
    clc
    Arr = [ 1, -5, -3, 6, 9 ]
    for i = 1 : length( Arr )
        if Arr( i ) > 0
            continue;
        end
        Arr( i ) = Arr( i )^2;
    end
    Arr
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    运行结果:

    Arr =
         1    -5    -3     6     9
    Arr =
         1    25     9     6     9
    
    • 1
    • 2
    • 3
    • 4

    提示:本题按上述方法实现,是为了演示continue的用法。也可以使用其它的实现方法,即判断元素是否小于0。

    三、while…end循环结构

    1.语法:
    while…end循环用于事先已知循环次数的情形,其语法如下:

    while  条件表达式
                循环体语句组
    end
    
    • 1
    • 2
    • 3

    若表达式为真,则执行循环体的内容,执行后再判断表达式是否为真,若为假则跳出循环体,否则继续执行循环体。
    2.while循环示例程序
    Demo 6:从键盘输入若干个正整数,当输入0时结束输入,求这些数的平均值和它们之和。
    参考代码:

    clear all
    clc
    sum = 0;
    count = 0;
    val = input('Enter a number (end in 0):');
    while ( val ~= 0 )
        sum = sum + val; 
        count = count + 1;
        val = input('Enter a number (end in 0):');
    end
    if ( count > 0 )    
        disp( [ '和:', num2str( sum ) ] );
        disp( [ '平均值:', num2str( sum/count ) ] ); 
    end
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    运行结果:

    Enter a number (end in 0):1
    Enter a number (end in 0):5
    Enter a number (end in 0):8
    Enter a number (end in 0):6
    Enter a number (end in 0):9
    Enter a number (end in 0):0
    和:29
    平均值:5.8
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    注意:
    对于for循环,很多时候都可以使用数组的运算替代循环,这样能够有效提高运行速度,例如Demo 1中的例子。

  • 相关阅读:
    思考(八十七):协议加密与压缩
    CF104064 E. Exchange Students(NWERC2021)
    网络安全:常见的中间件以及环境搭建方法
    Ansible-常用模块
    kettle遇到的问题-脚本启动系统找不到指定路径
    【go零基础】go-zero从零基础学习到实战教程 - 0环境配置
    ant design pro git提交error; Angular 团队git提交规范
    【dp】砝码称重模型(选或不选)
    C# 对RabbitMQ使用
    C语言——自定义类型之结构体
  • 原文地址:https://blog.csdn.net/sunnyoldman001/article/details/127943415