作者: Steve Eddins 和 Loren Shure,MathWorks
对矩阵进行索引是从矩阵中选择或修改部分元素的一种方式。MATLAB 有几种索引样式,它们不仅功能强大、灵活,而且可读性强、表现力强。矩阵是 MATLAB 用来组织和分析数据的一个核心组件,索引是以可理解的方式有效操作矩阵的关键。
对于 MATLAB 用户来说,索引往往与另一个术语密切相关:向量化。向量化意味着使用 MATLAB 矩阵和向量运算而不是标量运算,这通常会生成更短的代码,更具数学表现力和可读性,有时执行速度还会更快。
对向量进行索引
我们从向量和下标的简单情况开始。
v = [16 5 9 4 2 11 7 14];下标可以是单个值:
v(3) % 提取第三个元素 ans = 9下标本身也可以是另一个向量。
v([1 5 6]) % 提取第一个、第五个和第六个元素 ans = 16 2 11MATLAB 中的冒号表示法提供一种从 v 中提取一系列元素的简单方法。
v(3:7) % 提取第三个至第七个元素 ans = 9 4 2 11 7交换 v 的两个“半部分”以创建新向量。
v2 = v([5:8 1:4]) % 提取并交换 v 的两个“半部分” v2 = 2 11 7 14 16 5 9 4特殊的 end 运算符是引用 v 的最后一个元素的简便快捷方法。
v(end) % 提取最后一个元素 ans = 14end 运算符可用于表示一个范围。
v(5:end) % 提取第五个到最后一个元素 ans = 2 11 7 14您甚至可以使用 end 进行算术运算。
v(2:end-1) % 提取第二个到倒数第二个元素 ans = 5 9 4 2 11 7将冒号运算符和 end 结合使用可以实现多种效果,例如提取每第 k 个元素或翻转整个向量。
v(1end) % 提取所有奇数元素 ans = 16 9 2 7 v(end1) % 反转元素的顺序 ans = 14 7 11 2 4 9 5 16通过使用等号左侧的索引表达式,您可以替换向量的某些元素。
v([2 3 4]) = [10 15 20] % 替换 v 的某些元素 v = 16 10 15 20 2 11 7 14通常,右侧的元素数必须与左侧的索引表达式所引用的元素数相同。然而,您始终可以在右侧使用标量。这称为标量扩展。
v([2 3]) = 30 % 用 30 替换第二个和第三个元素 v = 16 30 30 20 2 11 7 14
请牢记:MATLAB 使用从 1 开始的索引。在对矩阵进行索引时,有些语言使用从 0 开始的索引。其他语言,如 MATLAB,使用从 1 开始的索引。MATLAB 使用的表示法可能与您在数学教科书中看到的相同。MATLAB 为什么使用从 1 开始的索引?MATLAB 创始人 Cleve Moler 对此解释道,“这就是数学的表示方式。”
使用两个下标对矩阵进行索引 现在考虑对矩阵进行索引。我们将在示例中使用幻方。
A = magic(4) A = 16 2 3 13 5 11 10 8 9 7 6 12 4 14 15 1通常,对矩阵进行索引需要使用两个下标 - 第一个下标表示行,第二个下标表示列。
A(2,4) % 提取第 2 行第 4 列中的元素 ans = 8更常见的是,其中的一个或两个下标可以是向量。
A(2:4,1:2) ans = 5 11 9 7 4 14下标位置中的单个“:”是 1:end 的简写表示法,通常用于选择整行或整列。
A(3,:) % 提取第三行 ans = 9 7 6 12 A(:,end) % 提取最后一列 ans = 13 8 12 1
有时人们对如何从矩阵中选择分散的元素感到困惑。例如,假设您要从 A 中提取元素 (2,1)、(3,2) 和 (4,4)。
矩阵中的分散元素。
我们如何表示这种输出?
表达式 A([2 3 4], [1 2 4]) 不会实现想要的效果。下图说明双下标索引的工作原理。
从矩阵中提取分散的元素需要不同索引样式,下一个主题将讲述这方面内容。
线性索引
表达式 A(14) 的作用是什么?
当仅使用单下标对矩阵 A 进行索引时,MATLAB 会将 A 视为其元素排列在一个长长的列向量中(对 A 中的列逐列从上到下进行索引),如下所示:
16
5
9
...
8
12
1
提示:MATLAB 采用列优先 - 线性索引逐列从上到下开始进行索引。
表达式 A(14) 只提取隐式列向量的第 14 个元素。以这种方式对只使用单下标的矩阵进行索引通常称为线性索引。 右图中每个矩阵元素的左上角均显示线性索引。从图中可以看出,A(14) 等同于 A(2,4)。
单下标可以是包含多个线性索引的向量,如在以下示例中:
A([6 12 15]) ans = 11 15 12再次考虑只提取 A 的元素 (2,1)、(3,2) 和 (4,4)。您可以使用线性索引来提取这些元素。
A([2 7 16]) ans = 5 7 1此示例很容易理解,但一般情况下如何计算线性索引?MATLAB 提供了名为 sub2ind 的函数,用于将行下标和列下标转换为线性索引。您可以通过以下方式使用它来提取所需的元素:
idx = sub2ind(size(A), [2 3 4], [1 2 4]) ans = 2 7 16 A(idx) ans = 5 7 1
逻辑索引
另一种索引变体是逻辑索引,它是一种紧凑而富有表现力的表示法,适用于包括图像处理在内的许多应用。在逻辑索引中,使用单个逻辑数组来表示矩阵下标。
您可以使用以下逻辑数组示例:
A > 12
A(A > 12) ans = 16 14 15 13许多以 is 开头的 MATLAB 函数返回逻辑数组,对于逻辑索引非常有用。例如,通过在一行代码中结合使用 isnan、逻辑索引和标量扩展,可以将数组中的所有 NaN 元素替换为另一个值。
B(isnan(B)) = 0MATLAB 有许多返回逻辑数组的字符串数组函数,例如 contains、startsWith 和 matches。您可以使用这些函数对使用逻辑索引的文本进行操作。例如,您可以提取包含“Skylab”的所有太空计划名称
>> names
>> names(contains(names,"Skylab"))
nan_locations = find(isnan(A)); A(nan_locations) = 0; A = filter2(ones(3,3), A); A(nan_locations) = NaN;我们希望本文中的这些示例能帮助您了解如何简洁高效地表达算法。在您的 MATLAB 编程中使用这些方法和相关函数使您能够创建简洁、可读和向量化的代码。
全部0条评论
快来发表一下你的评论吧 !