MATLAB - 数组索引
MATLAB - 数组索引
Section titled “MATLAB - 数组索引”在 MATLAB 中,一切皆为数组。高效地访问和修改数组的各个部分是一项基本技能。MATLAB 提供了几种强大的索引技术:下标索引(subscript indexing)、线性索引(linear indexing)和逻辑索引(logical indexing)。理解这些方法是编写清晰、高效且符合 ‘MATLAB 习惯’ 的代码的关键。
重要提示:1-基于索引
Section titled “重要提示:1-基于索引”与许多使用 0-基于索引的编程语言(如 Python、C++ 或 Java)不同,MATLAB 使用 1-基于索引。这意味着任何数组维度的第一个元素都在索引 1 处,而不是 0。这是新用户常见的错误来源。
1. 下标索引
Section titled “1. 下标索引”这是访问多维数组元素最直观的方式,为每个维度使用单独的索引。
% 为我们的示例创建一个 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 = 702. 线性索引
Section titled “2. 线性索引”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 函数在下标索引和线性索引之间进行转换,这在高级应用中非常有用。
3. 冒号运算符 (:) 和切片
Section titled “3. 冒号运算符 (:) 和切片”冒号运算符是选择元素范围或对数组进行“切片”的强大工具。它可用于选择整行、整列或子数组。
| 语法 | 描述 |
|---|---|
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 1204. 逻辑索引
Section titled “4. 逻辑索引”这可以说是最强大的索引技术。您可以使用与您要索引的数组大小相同的逻辑数组(由 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)实际应用:数据清洗
Section titled “实际应用:数据清洗”逻辑索引对于数据操作非常有用。例如,让我们找出矩阵 A 中所有大于 100 的值,并将它们替换为 -1。
A(A > 100) = -1
A = 10 20 30 40 50 60 70 80 90 100 -1 -1与编写嵌套的 for 循环来实现相同的结果相比,这一行代码效率更高,可读性更强。