数组操作简介(Introduction to Array Operations)

由于数组是 MATLAB 中的基本数据结构,因此了解如何有效使用数组非常重要。请参阅前一节了解数组的基础。

在 MATLAB 中,数组遵循与数学中相同的规则:默认情况下使用矩阵的定义方式进行运算,除非使用一个称为点操作符(dot operator)的特殊运算符。

由于数组操作与数学运算非常相似,因此有效使用 MATLAB 需要掌握基本的线性代数知识。不过,在术语使用上我们不会像数学那样严谨,例如“向量”和“矩阵”在 MATLAB 中都表示双精度数组(实质都是矩阵),而 MATLAB 将只有一行或一列的矩阵称为向量。但 MATLAB 中也有针对向量的专用函数,详见向量模块。


基础操作(Basics)

访问矩阵元素(Accessing Elements of a Matrix)

使用单个索引:

>> a = [1, 2, 3];
>> a(1)

ans = 1

>> a(3)

ans = 3

超出索引范围会报错:

>> a(5)
??? Index exceeds matrix dimensions.

使用多个索引((i,j))访问二维矩阵元素:

>> a = [1, 2; 3, 4];
>> a(1,2)

ans = 2

>> a(2,1)

ans = 3

使用单一线性索引(列优先):

MATLAB 采用列优先(column-major)顺序。

>> a = [1, 2, 3; 4, 5, 6];
>> a(3)

ans = 2

使用冒号(:)进行块索引:

>> a = [1, 2, 3; 4, 5, 6];
>> a(1,:)     % 第一行所有列
ans = 1 2 3

>> a(1,1:2)   % 第一行前两个元素
ans = 1 2

>> a(:)       % 转为列向量(列优先)
ans = 
    1
    4
    2
    5
    3
    6

使用 end 操作符访问最后的元素:

>> a(1, 2:end)

ans = 2 3

逻辑索引(Logical Addressing)

除了常规索引,还可以使用逻辑条件筛选数组中的元素。例如,只提取在 2 和 4 之间的值:

方法一:使用 find 函数:

>> a = [1.1, 2.1, 3.2, 4.5];
>> INDICES = find(a >= 2 & a <= 4);
>> a(INDICES)

ans = 2.1  3.2

方法二:使用逻辑索引:

>> a(a >= 2 & a <= 4)

ans = 2.1  3.2

基本运算(Basic Operations)

数组上的算术运算:

加法和减法:

>> [1, 2, 3] - [1, 2, 1]

ans = 0  0  2

标量乘法:

>> 2 * [1, 2, 3]

ans = 2  4  6

数组间乘除(矩阵乘法):

  • 只有在左操作数的列数等于右操作数的行数时,* 才能计算矩阵乘积。

>> a = [1, 2; 3, 4];
>> a * a

ans =
     7    10
    15    22

>> a = [1, 2, 3]; b = [1; 2; 3];
>> a * b

ans = 14

错误示例:

>> a * a
??? Inner matrix dimensions must agree.

除法 /:右操作数必须可逆。对于方阵,a / b 相当于 a * inv(b)

>> a = [1,2;3,4]; b = [1,2;1,2];
>> b / a

ans =
     1     0
     1     0

>> a / b

Warning: Matrix is singular to working precision.
ans =
   Inf   Inf
   Inf   Inf

点操作(Component-wise Operations)

若需进行逐元素乘法、除法或幂运算,请使用点操作符(.*./.^):

>> a = [1,2,3]; b = [0,1,2];
>> a .* b

ans = 0  2  6

转置(Transpose)

转置使用 .'

>> array = [1,2;3,4]
>> array.'

ans =
     1     3
     2     4

数组布尔运算(Boolean Operators on Arrays)

布尔运算可逐元素比较两个数组,返回相同大小的逻辑数组:

>> A = [2,4]; B = [1,5];
>> A < B

ans = [0  1]

注意: 用数组比较作为循环条件可能引起歧义,因为返回的是数组而不是单个布尔值。

推荐使用 any()all()

  • any(array):只要有一个非零元素返回 true

  • all(array):所有元素非零才返回 true


拼接数组(Concatenating Arrays)

水平拼接(Horizontal):

>> a = [1,2;3,4];
>> b = [5,6;7,8];
>> c = [a, b]

c =
     1     2     5     6
     3     4     7     8

垂直拼接(Vertical):

>> c = [a; b]

c =
     1     2
     3     4
     5     6
     7     8

求解线性方程组(Solving Linear Systems)

求解形如 Ax = b 的线性方程组,使用反斜杠运算符 \

>> A = [4 5; 2 8];
>> b = [23; 28];
>> x = A \ b

x =
     2
     3


Last modified: Tuesday, 15 April 2025, 11:01 AM