线性索引,逻辑索引等等

我们习惯于在Matlab中使用不同forms的索引:

  • 标准(每个维度使用整数),
  • 逻辑(使用逻辑值),
  • 线性(使用单个索引来遍历具有多个维度的数组)。

乍一看,这些forms似乎是独占的:索引是标准的,或逻辑的或线性的。 但是,有时这些forms中有几种似乎是混合的。 例如,

>> 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 

在此expression式中,第一个坐标使用标准(整数值)索引,第二个使用逻辑索引。

这些例子(以及在实践中出现的更复杂的例子)提出了以下问题:

  • Matlab中有哪些types的索引?
  • 他们怎么可以结合?
  • 他们应该如何参考?

在下面我使用的术语我认为或多或less符合标准的Matlab实践。 然而,在某些情况下,我不得不做一个名字,因为我不知道现有的名字。 请让我知道是否有比我使用的更多的标准名称。

这个答案试图澄清不同types的索引以及它们如何组合。 另一个问题是如何确定输出数组的形状size )作为索引variables形状的函数。 一个很好的post是罗兰舒尔的索引本质

下面的描述重点介绍数值数组的索引,但是它可以应用于带圆括号或花括号索引的单元格数组,输出types(单元格数组或逗号分隔列表)的输出types明显改变。 这将在最后简要讨论。

数值数组中的索引types

索引可以考虑以下两个属性进行分类。

  1. 根据每个索引variables引用的维数,索引可以是多维的或线性的。 但这只是两个极端的例子。 存在一个中间情况,可能被称为部分线性索引:

    • 多维索引为数组的每个维度指定一个索引variables。 在Matlab文档中,单个索引有时被称为下标 (参见例如sub2ind )。
    • 纯粹的线性索引指定一个单一的索引variables,遍历所有维度的数组(这可以看作是所有维度都合并为一个)。 我们知道,遍历是沿着列首先,然后沿着行,然后沿着第三个昏暗的切片等(所谓的列 – 主要次序 )。
    • 部分线性索引:给定一个具有m+n维度的数组, n>=2 ,可以为前m维指定m索引variables(因此在这些维中使用多维索引),最后n维指定一个索引variables只解释为这些维度的线性索引(最后n维度合并为一个维度)。
  2. 根据索引值的types,每个索引variables可以是整数值或逻辑值:

    • 如果索引variables包含正整数,则为整数值 ;
    • 如果索引variables包含逻辑值是合乎逻辑的。

分类标准1和2是独立的 。 从标准1的angular度来看,指数的类别与标准2的类别没有关系。所有的组合都是可能的。

因此,根据以上分类,有6种基本的索引types 。 澄清一下,下面是每个例子。 所有示例都使用数组A = cat(3, magic(3), 9+magic(3)) ,也就是说,

 A(:,:,1) = 8 1 6 3 5 7 4 9 2 A(:,:,2) = 17 10 15 12 14 16 13 18 11 
  1. 多维的整数值:

     >> A([1 2], 2, 2) ans = 10 14 
  2. 线性,整数值:

     >> A([2 5:7]) ans = 3 5 9 6 
  3. 部分线性,整数值:

     >> A([1 2], 2:4) ans = 1 6 17 5 7 12 
  4. 多维的逻辑:

     >> A([true true false], [false true false], [false true]) ans = 10 14 

    有趣的是,逻辑值的数量可能小于或者甚至大于索引所指的维度中的大小:

     >> A([true true], [false true false false], [false true]) ans = 10 14 

    缺less值将被解释为false ,并且剩余值必须为false或将发生错误。 请参阅Mathworks的此页面或Jonas的回答 。

  5. 线性,逻辑:

     >> A([false true false false true true true]) ans = 3 5 9 6 

    (请注意,索引向量中已遗漏了11个尾随的false值。)

  6. 部分线性,逻辑:

     >> A([true true false], [false true true true false false]) ans = 1 6 17 5 7 12 

在多维或部分线性索引中,其中有多个索引variables,每个索引variables可以独立地为整数值或逻辑值。 这产生了不同的混合types 。 例如:

  1. 多维的逻辑/整数值:

     >> A([true false true], [false true true], 2) ans = 10 15 18 11 
  2. 部分线性,整数值/逻辑:

     >> A([1 2], [true false true false true false]) ans = 8 6 10 3 7 14 

如果正被索引的数组是一个稀疏matrix,所有上述情况仍然适用,除了matrix不存在部分线性索引; 当然结果也是稀疏的。

索引单元格arrays

所有为数值数组描述的索引types都可以应用于单元arrays,还有一个额外的考虑因素。 单元格数组可以使用圆括号或花括号进行索引。 在第一种情况下,索引的结果是一个单元arrays。 第二个是单元格内容的逗号分隔列表。

作为一个例子,假设前面例子中使用的数值数组被转换成单元格数组C = num2cell(A) ,也就是说,

 C(:,:,1) = [8] [1] [6] [3] [5] [7] [4] [9] [2] C(:,:,2) = [17] [10] [15] [12] [14] [16] [13] [18] [11] 

然后在上面的例子8中使用的索引将产生单元arrays

 >> C([1 2], [true false true false true false]) ans = [8] [6] [10] [3] [7] [14] 

而使用大括号会产生逗号分隔的列表

 >> C{[1 2], [true false true false true false]} ans = 8 ans = 3 ans = 6 ans = 7 ans = 10 ans = 14 

外带消息/ TL; DR

逻辑和线性索引不是索引的唯一types。 相反,它们是索引的两个独立特征。 “逻辑”是指索引值的types,“线性”是指几个维度被折叠并索引为一个。 这两个function可以同时发生。