我们习惯于在Matlab中使用不同形式的索引:
-
standard(沿每个维度使用整数),
-
逻辑(使用逻辑值),
-
linear(使用单个索引遍历具有多个维度的数组) .
乍一看,似乎这些形式是独占的:索引是标准的,逻辑的或线性的 . 然而,有时似乎在这些形式中的几种形式之间存在混合 . 例如,
>> A = magic(3)
A =
8 1 6
3 5 7
4 9 2
>> A(A>5)
ans =
8
9
6
7
这是合乎逻辑的索引,对吧?但它也具有线性索引的一些功能,因为返回了列向量 . 实际上,逻辑索引 A>5
与线性索引 find(A>5)
具有相同的效果 .
作为第二个例子,考虑一下
>> A = magic(3)
A =
8 1 6
3 5 7
4 9 2
>> A(1:2, [true false true])
ans =
8 6
3 7
在此表达式中,标准(整数值)索引用于第一个坐标,逻辑索引用于第二个坐标 .
这些例子(以及在实践中出现的更复杂的例子)提出了以下问题:
-
What types of indexing are there in Matlab?
-
How can they be combined?
-
How should they be referred to?
1 回答
在下面我使用 terminology ,我认为或多或少符合标准的Matlab实践 . 但是,在某些情况下,我知道现有的一个 . 如果有比我正在使用的标准名称更多的标准名称,请告诉我 .
这个答案试图澄清不同类型的索引以及它们如何组合 . 另一个问题是输出数组的 shape (
size
)如何被确定为索引变量形状的函数 . 关于这个的好帖子是Loren Shure的Essence of indexing .下面的描述侧重于 numerical arrays 的索引,但它可以应用于带有括号或大括号索引的 cell arrays ,输出类型明显改变(分别是单元格数组或逗号分隔列表) . 最后将简要讨论这个问题 .
数值数组中的索引类型
可以考虑以下两个属性对索引进行分类 .
根据每个索引变量引用的维数,索引可以是多维的或线性的 . 但这些只是两种极端情况 . 存在中间情况,可称为部分线性索引:
Pure multidimensional indexing为数组的每个维度指定索引变量 . 在Matlab文档中,各个索引有时称为 subscripts (参见例如sub2ind) .
纯 linear 索引指定在所有维度上遍历数组的单个索引变量(可以将其视为所有维度合并为一个维度) . 我们知道,遍历首先是沿着列,然后沿着行,然后沿着第三个暗淡的切片等(所谓的column-major order) .
Partially linear 索引:给定一个
m+n
维数的数组,n>=2
,可以为第一个m
维度指定m
索引变量(因此在这些维度中使用多维索引),为最后n
维度指定一个索引变量,这被解释为线性索引仅适用于那些尺寸(最后n
尺寸合并为一个) .根据索引值的类型,每个索引变量可以是整数值或逻辑:
如果索引变量包含正整数,则为 integer-valued ;
如果索引变量包含逻辑值,则为 logical .
分类标准1和2是 independent . 从标准1的角度来看,指数的类别与根据标准2的类别没有关系 . 所有组合都是可能的 .
因此,根据上述分类,索引有6个 basic types . 为了澄清,以下是每个例子 . 所有示例都使用数组
A = cat(3, magic(3), 9+magic(3))
,即有趣的是,逻辑值的数量可能比索引所指的维度中的大小更小,甚至更大:
缺失值被解释为
false
,剩余值必须为false
,否则将发生错误 . 请参阅例如this page by Mathworks或this answer by Jonas .(请注意,索引向量中省略了11个尾随
false
值 . )在多维或部分线性索引中,其中存在多个索引变量,每个索引变量可以独立地为整数值或逻辑 . 这导致了不同的 mixed types . 例如:
如果被索引的数组是 sparse matrix ,则上述所有数据仍然适用,除了矩阵不存在部分线性索引;当然结果也很稀疏 .
单元格数组的索引
可以将针对数值阵列描述的所有类型的索引应用于单元数组,还有一个额外的考虑 . 单元格数组可以用括号或花括号索引 . 在第一种情况下,索引的结果是单元阵列 . 在第二个中,它是以逗号分隔的单元格内容列表 .
例如,假设前面示例中使用的数值数组转换为单元格数组
C = num2cell(A)
,即然后,上面的示例8中使用的索引将产生单元阵列
而使用花括号会产生以逗号分隔的列表
外卖消息/ TL; DR
逻辑和线性索引不是唯一的索引类型 . 相反,它们是索引的两个独立功能 . “逻辑”是指索引值的类型,“线性”表示多个维度正在折叠并索引为一个维度 . 这两个功能可以同时发生 .