在 MATLAB中,根据元素在数组中的位置(索引)访问数组元素的方法主要有三种:按位置索引、线性索引和逻辑索引。
按元素位置进行索引
最常见的方法是显式指定元素的索引。例如,要访问矩阵中的某个元素,请依序指定该元素的行号和列号。
代码语言:javascript复制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 的第二行中的第一个和第三个元素。
代码语言:javascript复制r = A(2,[1 3])
r = 1×2
5 7
要访问某个行范围或列范围内的元素,请使用 colon。例如,访问 A 中第一到三行、第二到四列中的元素。
代码语言:javascript复制r = A(1:3,2:4)
r = 3×3
2 3 4
6 7 8
10 11 12
计算 r 的另一种方法是使用关键字 end 指定第二直至最后一列。通过此方法,可以直接指定最后一列,而不必知道 A 中到底有多少列。
代码语言:javascript复制r = A(1:3,2:end)
r = 3×3
2 3 4
6 7 8
10 11 12
如果要访问所有行或所有列,只使用冒号运算符即可。例如,返回 A 的整个第三列。
代码语言:javascript复制r = A(:,3)
r = 4×1
3
7
11
15
通常,可以使用索引来访问 MATLAB 中任何数组的元素,而不管其数据类型或维度如何。例如,直接访问 datetime 数组的列。
代码语言:javascript复制t = [datetime(2018,1:5,1); datetime(2019,1:5,1)]
t = 2x5 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 = 2x1 datetime
01-Mar-2018
01-Mar-2019
对于更高维度的数组,可以扩展语法以匹配数组维度。假设有一个随机的 3×3×3 数值数组。访问位于该数组第一页中第二行第三列的元素。
代码语言:javascript复制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 组成的序列,可以用单个冒号全部显示。
代码语言:javascript复制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 是存储的向量序列中的第六个元素。
代码语言:javascript复制e = A(3,2)
e = 25
elinear = A(6)
elinear = 25
线性索引在视觉上可能不太直观,但在执行某些不依赖于数组大小或形状的计算时很有用。例如,可以轻松地对 A 的所有元素求和,而无需指定 sum 函数的第二个参数。
代码语言:javascript复制s = sum(A(:))
s = 330
sub2ind 和 ind2sub 函数可用于在数组的原始索引和线性索引之间进行转换。例如,计算 A 的第 3,2 个元素的线性索引。
代码语言:javascript复制linearidx = sub2ind(size(A),3,2)
linearidx = 6
从线性索引转换回行和列形式。
代码语言:javascript复制[row,col] = ind2sub(size(A),6)
row = 3
col = 2
使用逻辑值进行索引
使用 true 和 false 逻辑指示符也可以对数组进行索引,在处理条件语句时尤其便利。例如,假设想知道矩阵 A 中的元素是否小于另一个矩阵 B 中的对应元素。当 A 中的元素小于 B 中的对应元素时,小于号运算符返回元素为 1 的逻辑数组。
代码语言:javascript复制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 = 2x3 logical array
0 1 1
0 1 0
现在已经知道满足条件的元素的位置,可以使用 ind 作为索引数组来检查各个值。MATLAB 将 ind 中值 1 的位置与 A 和 B 中的对应元素进行匹配,并在列向量中列出它们的值。
代码语言:javascript复制Avals = A(ind)
Avals = 3×1
2
3
6
Bvals = B(ind)
Bvals = 3×1
3
7
7
MATLAB 中的 is 函数还返回逻辑数组,指示输入中的哪些元素满足特定条件。例如,使用 ismissing 函数检查 string 向量中的哪些元素是缺失值。
代码语言:javascript复制str = ["A" "B" missing "D" "E" missing];
ind = ismissing(str)
ind = 1x6 logical array
0 0 1 0 0 1
假设要查找非缺失值元素的值。将 ~ 运算符和索引向量 ind 结合使用即可实现此目的。
代码语言:javascript复制strvals = str(~ind)
strvals = 1x4 string
"A" "B" "D" "E"