跳转至

MATLAB 基本运算符详解

MATLAB 提供了丰富多样的运算符,用于执行算术计算、关系比较和逻辑判断。这些运算符是 MATLAB 编程语言的基础,并被深度优化以支持其核心的数组和矩阵计算。

核心概念:逐元素运算 (Element-wise) vs. 矩阵运算 (Matrix)

理解并区分这两种运算模式是高效使用 MATLAB 的关键。 * 逐元素运算: 使用带点 (.) 的运算符(如 .*, .^),对两个同样大小的数组中位置对应的元素独立执行运算。这是数据处理和分析中最常见的模式。 * 矩阵运算: 使用不带点的运算符(如 *, ^),遵循线性代数的运算法则,将数组作为一个整体进行数学变换。

算术运算符 (Arithmetic Operators)

逐元素算术运算 (Element-wise Operations)

这些运算要求参与的数组尺寸相同,或者其中一个是标量。

  • + (加法)

    • 描述: 逐元素相加。
    • 示例:
      A = [1, 2; 3, 4];
      B = [10, 20; 30, 40];
      C = A + B; % 结果是 [11, 22; 33, 44]
      
  • - (减法)

    • 描述: 逐元素相减。
    • 示例:
      A = [10, 20; 30, 40];
      D = A - 1; % 标量减法,结果是 [9, 19; 29, 39]
      
  • .* (逐元素乘法)

    • 描述: 将两个数组中对应位置的元素相乘,也称为哈达玛积 (Hadamard product)。
    • 示例:
      A = [1, 2; 3, 4];
      B = [10, 20; 30, 40];
      C = A .* B; % 结果是 [10, 40; 90, 160]
      
  • ./ (逐元素右除)

    • 描述:A 的每个元素除以 B 中对应位置的元素。
    • 示例:
      A = [10, 40];
      B = [2, 5];
      C = A ./ B; % 结果是 [5, 8]
      
  • .\ (逐元素左除)

    • 描述:B 的每个元素除以 A 中对应位置的元素。
    • 示例:
      A = [10, 40];
      B = [2, 5];
      C = A .\ B; % 结果是 [0.2, 0.125],即 [2/10, 5/40]
      
  • .^ (逐元素求幂)

    • 描述:A 中每个元素作为底数,B 中对应位置的元素或一个标量作为指数。
    • 示例:
      A = [1, 2; 3, 4];
      C = A .^ 2; % 结果是 [1, 4; 9, 16]
      

矩阵算术运算 (Matrix Operations)

  • * (矩阵乘法)

    • 描述: 执行标准的矩阵乘法。要求第一个矩阵 A 的列数必须等于第二个矩阵 B 的行数。
    • 示例:
      A = [1, 2; 3, 4]; % 2x2
      B = [5; 6];       % 2x1
      C = A * B;        % 结果是 2x1 向量 [17; 39]
      
  • \ (矩阵左除)

    • 描述: 主要用于求解线性方程组 \(Ax = b\),这是数值上最稳定、最高效的方法。
    • 示例:
      A = [2, 1; 1, 3]; % 系数矩阵
      b = [5; 7];       % 结果向量
      x = A\b;          % 求解 A*x = b,x 的结果是 [1.6; 1.8]
      
  • / (矩阵右除)

    • 描述: 主要用于求解线性方程组 \(xA = b\)
    • 示例:
      A = [2, 1; 1, 3];
      x_true = [1.6, 1.8];
      b = x_true * A;
      x_solved = b / A;    % 求解 x*A = b,x_solved 的结果是 [1.6, 1.8]
      
  • ^ (矩阵求幂)

    • 描述: A^n 表示矩阵 A 与自身进行 n-1 次矩阵乘法。要求 A 必须是方阵
    • 示例:
      A = [1, 1; 0, 1];
      C = A^3; % 相当于 A*A*A,结果是 [1, 3; 0, 1]
      

关系运算符 (Relational Operators)

关系运算符用于逐元素比较,返回一个逻辑数组

  • == (等于), ~= (不等于), > (大于), < (小于), >= (大于或等于), <= (小于或等于)
  • 示例:
    A = [1, 5, 6; 8, 3, 9];
    L_greater = (A > 5);  % 结果是 [false, false, true; true, false, true]
    L_equal = (A == 5);   % 结果是 [false, true, false; false, false, false]
    

逻辑运算符 (Logical Operators)

逐元素逻辑运算

  • & (逻辑与), | (逻辑或), ~ (逻辑非), xor (逻辑异或)
  • 示例:
    L1 = [true, true, false, false];
    L2 = [true, false, true, false];
    R_and = L1 & L2; % 结果是 [true, false, false, false]
    R_or = L1 | L2; % 结果是 [true, true, true, false]
    

短路逻辑运算 (Short-Circuit)

  • && (短路与), || (短路或)
  • 描述: 仅作用于标量逻辑值。一旦结果确定,就停止计算后续部分,常用于 if 语句中避免错误。
  • 示例:
    index = 10;
    my_array = 1:5;
    % 第一个条件为 false,&& 短路,第二个条件不会执行,避免了索引错误
    if (index <= numel(my_array)) && (my_array(index) > 0)
        disp('This will not be displayed.');
    end
    

字符与字符串运算符 (Character and String Operators)

MATLAB 为处理文本提供了专门的运算符,特别是针对现代的 string 数组。

文本串联 (Concatenation)

  • + (字符串串联)

    • 描述: 加号 + 被重载用于 string 数组,是串联字符串的首选方法。
    • 示例:
      s1 = "Hello, ";
      s2 = "World!";
      s_combined = s1 + s2; % 结果是 "Hello, World!"
      
  • [] (字符数组水平串联)

    • 描述: 方括号 [] 用于串联传统的 char 数组(字符向量)。
    • 示例:
      c1 = 'Welcome ';
      c2 = 'to MATLAB.';
      c_horizontal = [c1, c2]; % 结果是 'Welcome to MATLAB.'
      
  • [] (字符数组垂直串联)

    • 描述: 垂直串联 char 数组时,各数组的长度(列数)必须完全相同。
    • 示例:
      c3 = 'Row 1'; % 5个字符
      c4 = 'Row 2'; % 5个字符
      c_vertical = [c3; c4]; % 结果是一个 2x5 的 char 数组
      

关系与比较 (Relational and Comparison)

  • == (字符串/字符数组相等性比较)

    • 描述: == 可直接比较 string 数组。对于 char 数组,传统上更推荐使用 strcmp 函数。
    • 示例 (string):
      s1 = "test";
      s2 = ["test", "debug"];
      L = (s1 == s2); % 结果是 [true, false]
      
  • > , <, >=, <= (字符串字典序比较)

    • 描述: 这些运算符对 string 数组执行逐元素的字典序(lexicographical)比较。
    • 示例:
      s1 = "apple";
      s2 = "apply";
      L1 = (s1 < s2);  % 结果是 true, 因为在第5个字符处 'e' < 'y'
      L2 = ("b" > "a"); % 结果是 true
      

运算符优先级 (Operator Precedence)

  • 描述: MATLAB 遵循标准的运算符优先级规则。括号 () 拥有最高优先级,可用于强制改变运算顺序。
  • 示例:
    % 优先级: 1st: ^, 2nd: *, 3rd: +
    result1 = 2 + 5 * 3^2; % 计算顺序: 3^2=9 -> 5*9=45 -> 2+45=47
    
    % 使用括号改变运算顺序
    result2 = (2 + 5) * 3^2; % 计算顺序: (2+5)=7 -> 3^2=9 -> 7*9=63
    

其他重要运算符

: (冒号运算符)

  • 创建序列

    • 示例:
      v = 1:2:10; % 创建从1到10,步长为2的序列: [1, 3, 5, 7, 9]
      
  • 索引(“全选”)

    • 示例:
      A = magic(3); % 创建一个 3x3 的 magic 矩阵
      col2 = A(:, 2); % 提取第二整列
      
  • 重塑为列向量

    • 示例:
      A = [1, 2; 3, 4];
      col_vec = A(:); % 将矩阵 A 重塑为列向量 [1; 3; 2; 4]
      

' (共轭转置) 和 .' (非共轭转置)

  • .' (非共轭转置)

    • 描述: 总是执行单纯的转置(交换行列),即使对于复数矩阵。
    • 示例:
      C = [1+1i; 2-2i];
      C_transpose = C.'; % 结果是 [1+1i, 2-2i]
      
  • ' (共轭转置)

    • 描述: 对于复数矩阵,它会交换行列并对每个元素取复共轭。
    • 示例:
      C = [1+1i; 2-2i];
      C_conj_transpose = C'; % 结果是 [1-1i, 2+2i]
      

@ (函数句柄)

  • 描述: 创建指向一个函数的引用,常用于将函数作为参数传递。
  • 示例:
    f = @(x) x.^2 - sin(x);
    % 将函数句柄 f 传递给 integral 函数计算定积分
    result = integral(f, 0, 1);
    

. (点)

  • 描述: 访问结构体 (struct) 的字段或对象 (object) 的属性和方法。
  • 示例:
    patient.name = 'John Doe';
    patient.age = 42;
    % 访问 name 字段
    disp(patient.name); % 输出 'John Doe'