跳转至

MATLAB 流程控制语句

流程控制是任何编程语言的核心,它允许我们根据不同的条件执行不同的代码路径,或者重复执行某段代码。MATLAB 提供了与传统编程语言类似的、完整且直观的流程控制结构,但其语法以 end 关键字来明确地结束代码块。

本篇文档将详细介绍 MATLAB 中的条件语句、循环结构、循环控制以及错误处理机制。

条件语句 (Conditional Statements)

条件语句用于根据一个或多个逻辑条件的真假来决定程序的执行路径。

if-elseif-else 结构

这是最基础、最常用的条件判断结构。

  • 描述:
    • if: 当 conditiontrue 时,执行其下的代码块。
    • elseif: 如果前面的 ifelseif 条件不满足,则检查当前 elseif 的条件。可以有零个或多个 elseif 块。
    • else: 如果以上所有 ifelseif 条件都不满足,则执行 else 下的代码块。else 是可选的。
  • 语法:
    if condition1
        % 如果 condition1 为真,执行这里的语句
    elseif condition2
        % 如果 condition1 为假且 condition2 为真,执行这里的语句
    else
        % 如果以上所有条件都为假,执行这里的语句
    end
    
  • 示例:
    score = 85;
    
    if score >= 90
        grade = 'A';
    elseif score >= 80
        grade = 'B'; % 分数是 85,这个代码块将被执行
    elseif score >= 70
        grade = 'C';
    else
        grade = 'F';
    end
    
    disp(['你的等级是: ', grade]); % 输出 '你的等级是: B'
    

switch-case 结构

当需要基于一个变量的多个离散值进行判断时,switch-case 结构比 if-elseif-else 更清晰、更高效。

  • 描述:
    • switch: 计算一个表达式 switch_expression
    • case: 将 switch_expression 的结果与 case_expression 进行比较。如果匹配,则执行该 case 下的代码块。
    • otherwise: 如果没有任何 case 匹配成功,则执行 otherwise 下的代码块。它是可选的。
  • 语法:
    switch switch_expression
        case case_expression1
            % 语句
        case case_expression2
            % 语句
        case {case_expr3a, case_expr3b} % case 后面可以用元胞数组包含多个值
            % 语句
        otherwise
            % 语句
    end
    

与 C/Java 的区别

MATLAB 的 switch 语句在执行完一个匹配的 case 后会自动退出,不需要 像 C 或 Java 那样使用 break 语句。

  • 示例:
    city = 'Beijing';
    
    switch city
        case 'New York'
            continent = '北美洲';
        case 'London'
            continent = '欧洲';
        case {'Beijing', 'Tokyo'} % 'Beijing' 在这里匹配成功
            continent = '亚洲';
        otherwise
            continent = '未知';
    end
    
    disp([city, ' 位于 ', continent]); % 输出 'Beijing 位于 亚洲'
    

循环语句 (Loop Statements)

循环语句用于重复执行一段代码,直到满足某个退出条件。

for 循环

当循环的次数是已知的、确定的情况下,应优先使用 for 循环。

  • 描述: for 循环会遍历一个预定义序列(通常是一个向量)中的每一个值。在每次迭代中,循环变量 index 会被赋予序列中的一个新值。
  • 语法:
    for index = values
        % 在每次迭代中要执行的语句
    end
    ```*   **示例:**
    ```matlab
    % 计算 1 到 5 的平方
    squares = zeros(1, 5); % 性能提示:预先分配内存
    for i = 1:5
        squares(i) = i^2;
    end
    disp(squares); % 输出 [1, 4, 9, 16, 25]
    
    % 遍历一个元胞数组
    files = {'数据1.mat', '配置.txt', '图像.jpg'};
    for k = 1:length(files)
        disp(['正在处理文件: ', files{k}]);
    end
    

while 循环

当循环的终止条件不取决于迭代次数,而是取决于某个动态变化的逻辑条件时,应使用 while 循环。

  • 描述: 只要 condition 持续为 truewhile 循环就会一直执行其内部的代码块。必须确保循环体内部有代码能最终改变 condition 的状态,使其变为 false,否则将导致无限循环。
  • 语法:
    while condition
        % 只要 condition 为真,就执行这里的语句
    end
    
  • 示例:
    % 找到第一个大于 1000 的 2 的幂次方
    n = 1;
    while n <= 1000
        n = n * 2;
        % 循环过程: n 依次变为 2, 4, 8, ..., 512, 1024
    end
    % 当 n 变为 1024 时, n <= 1000 为 false, 循环终止
    disp(['第一个大于 1000 的 2 的幂是 ', num2str(n)]); % 输出 1024
    

循环控制语句 (Loop Control Statements)

这些语句用于在循环内部更精细地控制循环的执行流程。

break 语句

  • 描述: break 语句会完全终止其所在的最内层 forwhile 循环的执行,程序将跳转到循环体 end 之后的下一条语句。
  • 示例:
    % 在一个向量中查找第一个负数
    data = [10, 25, 9, -5, 18, 30];
    first_negative_index = -1; % 初始化为“未找到”状态
    
    for i = 1:length(data)
        if data(i) < 0
            first_negative_index = i;
            break; % 找到后立即退出循环,不再检查后续元素
        end
    end
    disp(['第一个负数发现在索引: ', num2str(first_negative_index)]); % 输出 4
    

continue 语句

  • 描述: continue 语句会跳过当前迭代中余下的代码,并直接开始下一次迭代。
  • 示例:
    % 计算一个向量中所有正数的和
    data = [10, -2, 5, -8, 20];
    total = 0;
    
    for i = 1:length(data)
        if data(i) < 0
            continue; % 如果当前元素是负数,则跳过下面的加法,开始下一次循环
        end
        total = total + data(i);
    end
    disp(['所有正数的和是: ', num2str(total)]); % 输出 35
    

错误处理 (Error Handling)

try-catch 结构

try-catch 语句提供了一种健壮的方式来处理代码中可能发生的错误,避免程序因意外问题而崩溃。

  • 描述:
    • try: 将可能出错的代码放入 try 代码块中。
    • catch: 如果 try 块中的代码执行时发生错误,程序会立即跳转到 catch 块执行,而不会中断。catch 块后面可以跟一个 exception 变量,该变量是一个对象,包含了错误的详细信息(如错误消息、堆栈等)。
  • 语法:
    try
        % 可能会产生错误的代码
    catch exception
        % 处理错误的代码
        % 'exception' 变量包含了错误信息
    end
    
  • 示例:
    filename = '一个不存在的文件.mat';
    
    try
        disp(['尝试加载文件 ', filename, '...']);
        load(filename); % 这行代码会因为文件不存在而产生错误
        disp('文件加载成功。'); % 这行代码不会被执行
    catch ME % ME 是 MException (MATLAB异常) 的常用缩写
        % 捕获到错误后,执行这里的代码
        warning('尝试加载文件时发生了一个错误。');
        disp('错误详情:');
        disp(ME.message); % 显示具体的错误信息
    end
    
    disp('程序在处理错误后继续运行。');