Skip to content

MATLAB - 数组索引

在 MATLAB 中,一切皆为数组。高效地访问和修改数组的各个部分是一项基本技能。MATLAB 提供了几种强大的索引技术:下标索引(subscript indexing)、线性索引(linear indexing)和逻辑索引(logical indexing)。理解这些方法是编写清晰、高效且符合 ‘MATLAB 习惯’ 的代码的关键。

与许多使用 0-基于索引的编程语言(如 Python、C++ 或 Java)不同,MATLAB 使用 1-基于索引。这意味着任何数组维度的第一个元素都在索引 1 处,而不是 0。这是新用户常见的错误来源。

这是访问多维数组元素最直观的方式,为每个维度使用单独的索引。

% 为我们的示例创建一个 3x4 矩阵
A = [10 20 30 40; 50 60 70 80; 90 100 110 120]
A =
10 20 30 40
50 60 70 80
90 100 110 120
% 访问第 2 行、第 3 列的元素
element = A(2, 3)
element =
70

MATLAB 还允许您使用单个索引访问数组元素,就好像整个数组是一个单列向量一样。元素首先按列向下编号。这称为线性索引(linear indexing)。

对于我们的矩阵 A,线性索引是:

1 4 7 10 (索引)
2 5 8 11
3 6 9 12
10 20 30 40 (值)
50 60 70 80
90 100 110 120
% 访问按列主序排列的第 6 个元素
A(6)
ans =
100

您可以使用 sub2ind 和 ind2sub 函数在下标索引和线性索引之间进行转换,这在高级应用中非常有用。

冒号运算符是选择元素范围或对数组进行“切片”的强大工具。它可用于选择整行、整列或子数组。

语法描述
A(:, c)选择第 c 列中的所有行。
A(r, :)选择第 r 行中的所有列。
A(:)选择 A 的所有元素,将它们作为单个列向量返回(使用线性索引)。
A(r1:r2, c1:c2)选择从行 r1 到 r2、从列 c1 到 c2 的子矩阵。
A(end, :)end 关键字指代维度中的最后一个索引。这会选择最后一行。
% 获取矩阵 A 的整个第 2 列
col2 = A(:, 2)
col2 =
20
60
100
% 获取矩阵 A 的第 3 行
row3 = A(3, :)
row3 =
90 100 110 120
% 从右下角获取一个 2x2 的子矩阵
subA = A(2:end, 3:end)
subA =
70 80
110 120

这可以说是最强大的索引技术。您可以使用与您要索引的数组大小相同的逻辑数组(由 true 和 false 值组成的数组)来选择逻辑数组中为 true 的元素。

这最常通过直接从条件创建逻辑数组来使用。

% 为 A 中所有大于 75 的元素创建一个逻辑掩码
is_large = A > 75
is_large =
3×4 logical array
0 0 0 0
0 0 0 1
1 1 1 1
% 使用此逻辑掩码从 A 中选择对应的元素
large_values = A(is_large)
large_values =
90
100
110
80
120

您也可以将其合并为一行,使其具有高度可读性:

large_values = A(A > 75)

逻辑索引对于数据操作非常有用。例如,让我们找出矩阵 A 中所有大于 100 的值,并将它们替换为 -1。

A(A > 100) = -1
A =
10 20 30 40
50 60 70 80
90 100 -1 -1

与编写嵌套的 for 循环来实现相同的结果相比,这一行代码效率更高,可读性更强。