数组索引
在 MATLAB® 中,根据元素在数组中的位置(索引)访问数组元素的方法主要有三种:按位置索引、线性索引和逻辑索引。您还可以通过组合位置索引和逻辑索引来使用混合索引。
按元素位置进行索引
最常见的方法是显式指定元素的索引。例如,要访问矩阵中的某个元素,请依序指定该元素的行号和列号。
A = [1 2 3 4; 5 6 7 8; 9 10 11 12; 13 14 15 16]
A = 4×4
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
e = A(3,2)
e = 10
e 是 A 中位于 3,2 位置(第三行第二列)的元素。
您还可以在一个向量中指定多个元素的索引,从而一次引用多个元素。例如,访问 A 的第二行中的第一个和第三个元素。
r = A(2,[1 3])
r = 1×2
5 7
要访问某个行范围或列范围内的元素,请使用 colon 运算符。例如,访问 A 中第一到第三行、第二到第四列中的元素。
r = A(1:3,2:4)
r = 3×3
2 3 4
6 7 8
10 11 12
访问这些元素的另一种方法是使用关键字 end 来表示最后一列。通过此方法,您可以直接指定最后一列,而不必知道 A 中到底有多少列。
r = A(1:3,2:end)
r = 3×3
2 3 4
6 7 8
10 11 12
如果要访问所有行或所有列,只使用冒号运算符即可。例如,返回 A 的整个第三行。
r = A(3,:)
r = 1×4
9 10 11 12
您还可以使用冒号运算符和 end 关键字访问 A 的倒数第二列。
r = A(:,end-1)
r = 4×1
3
7
11
15
通常,您可以使用索引来访问 MATLAB 中任何数组的元素,而不管其数据类型或维度如何。例如,直接访问 datetime 数组的列。
t = [datetime(2018,1:5,1); datetime(2019,1:5,1)]
t = 2×5 datetime
01-Jan-2018 01-Feb-2018 01-Mar-2018 01-Apr-2018 01-May-2018
01-Jan-2019 01-Feb-2019 01-Mar-2019 01-Apr-2019 01-May-2019
march1 = t(:,3)
march1 = 2×1 datetime
01-Mar-2018
01-Mar-2019
对于更高维度的数组,可以扩展语法以匹配数组维度。假设有一个随机的 3×3×3 数值数组。访问位于该数组第一页中第二行第三列的元素。
A = rand(3,3,3); e = A(2,3,1)
e = 0.5469
有关操作多维数组的详细信息,请参阅多维数组。
使用单个索引进行索引
访问数组元素的另一种方法是只使用单个索引,而不管数组的大小或维度如何。这种方法称为线性索引。虽然 MATLAB 根据定义的大小和形状显示数组,但实际上数组在内存中逐列存储,从左到右进行。我们可以使用矩阵来直观地理解这一概念。下面的数组虽然显示为 3×3 矩阵,但 MATLAB 将它存储为单列,由 A 的各列顺次连接而成。存储的向量包含由元素 12、45、33、36、29、25、91、48、11 组成的序列,可以用单个冒号全部显示。
A = [12 36 91; 45 29 48; 33 25 11]
A = 3×3
12 36 91
45 29 48
33 25 11
Alinear = A(:)
Alinear = 9×1
12
45
33
36
29
25
91
48
11
例如,A 的第 3,2 个元素是 25,您可以使用语法 A(3,2) 访问它。您也可以使用语法 A(6) 访问此元素,因为 25 是存储的向量序列中的第六个元素。
e = A(3,2)
e = 25
elinear = A(6)
elinear = 25
线性索引在视觉上可能不太直观,但在执行某些不依赖于数组大小或形状的计算时很有用。例如,您可以轻松地对 A 的所有元素求和,而无需指定 sum 函数的第二个参量。
s = sum(A(:))
s = 330
sub2ind 和 ind2sub 函数可用于在数组的原始索引和线性索引之间进行转换。例如,计算 A 的第 3,2 个元素的线性索引。
linearidx = sub2ind(size(A),3,2)
linearidx = 6
将线性索引转换回行和列形式。
[row,col] = ind2sub(size(A),6)
row = 3
col = 2
使用逻辑值进行索引
使用 true 和 false 逻辑指示符也可以对数组进行索引,在处理条件语句时尤其便利。例如,假设您想知道矩阵 A 中的元素是否小于另一个矩阵 B 中的对应元素。当 A 中的元素小于 B 中的对应元素时,小于号运算符返回元素为 1 的逻辑数组。
A = [1 2 6; 4 3 6]
A = 2×3
1 2 6
4 3 6
B = [0 3 7; 3 7 5]
B = 2×3
0 3 7
3 7 5
ind = A < B
ind = 2×3 logical array
0 1 1
0 1 0
现在已经知道满足条件的元素的位置,可以使用 ind 作为索引数组来检查各个值。MATLAB 将 ind 中值 1 的位置与 A 和 B 中的对应元素进行匹配,并在列向量中列出它们的值。
Avals = A(ind)
Avals = 3×1
2
3
6
Bvals = B(ind)
Bvals = 3×1
3
7
7
MATLAB 中的 is 函数还返回逻辑数组,指示输入中的哪些元素满足特定条件。例如,使用 ismissing 函数检查字符串向量中的哪些元素是缺失值。
str = ["A" "B" missing "D" "E" missing]; ind = ismissing(str)
ind = 1×6 logical array
0 0 1 0 0 1
假设要查找非缺失值元素的值。将 ~ 运算符和索引向量 ind 结合使用即可实现此目的。
strvals = str(~ind)
strvals = 1×4 string
"A" "B" "D" "E"
有关使用逻辑索引的更多示例,请参阅查找满足条件的数组元素。
使用逻辑值和元素位置的混合索引
您还可以结合使用位置索引和逻辑索引来访问数组元素。
例如,创建一个 5×5 矩阵。
A = magic(5)
A = 5×5
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9
假设您要选择 A 中的某些元素,这些元素位于具有质数索引的行中和具有索引 2、3 和 4 的列中。

为此,创建一个向量 B,表示 A 中行的索引。
B = (1:size(A,1))
B = 1×5
1 2 3 4 5
使用 isprime 函数来确定 B 中的哪些元素是质数。结果为一个逻辑数组,您可以用它对 A 的行进行索引。
rows = isprime(B)
rows = 1×5 logical array
0 1 1 0 1
接下来,定义您要选择的列,它们位于位置 2 到 4 上。
cols = 2:4
cols = 1×3
2 3 4
使用逻辑索引选择 A 中位于质数位置的行,如 rows 所定义。然后,使用按位置索引来选择 A 的列,范围从位置 2 到 4,如 cols 所定义。
A(rows,cols)
ans = 3×3
5 7 14
6 13 20
18 25 2