首页 文章

线性索引,逻辑索引以及所有这些

提问于
浏览
31

我们习惯于在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 回答

  • 37

    在下面我使用 terminology ,我认为或多或少符合标准的Matlab实践 . 但是,在某些情况下,我知道现有的一个 . 如果有比我正在使用的标准名称更多的标准名称,请告诉我 .

    这个答案试图澄清不同类型的索引以及它们如何组合 . 另一个问题是输出数组的 shapesize )如何被确定为索引变量形状的函数 . 关于这个的好帖子是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)) ,即

    A(:,:,1) =
         8     1     6
         3     5     7
         4     9     2
    A(:,:,2) =
        17    10    15
        12    14    16
        13    18    11
    
    • 多维,整数值:
    >> A([1 2], 2, 2)
    ans =
        10
        14
    
    • 线性,整数值:
    >> A([2 5:7])
    ans =
         3     5     9     6
    
    • 部分线性,整数值:
    >> A([1 2], 2:4)
    ans =
         1     6    17
         5     7    12
    
    • 多维,合乎逻辑:
    >> A([true true false], [false true false], [false true])
    ans =
        10
        14
    

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

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

    缺失值被解释为 false ,剩余值必须为 false ,否则将发生错误 . 请参阅例如this page by Mathworksthis answer by Jonas .

    • 线性,合乎逻辑:
    >> A([false true false false true true true])
    ans =
         3     5     9     6
    

    (请注意,索引向量中省略了11个尾随 false 值 . )

    • 部分线性,合乎逻辑:
    >> A([true true false], [false true true true false false])
    ans =
         1     6    17
         5     7    12
    

    在多维或部分线性索引中,其中存在多个索引变量,每个索引变量可以独立地为整数值或逻辑 . 这导致了不同的 mixed types . 例如:

    • 多维,逻辑/整数值:
    >> A([true false true], [false true true], 2)
    ans =
        10    15
        18    11
    
    • 部分线性,整数值/逻辑:
    >> A([1 2], [true false true false true false])
    ans =
         8     6    10
         3     7    14
    

    如果被索引的数组是 sparse matrix ,则上述所有数据仍然适用,除了矩阵不存在部分线性索引;当然结果也很稀疏 .

    单元格数组的索引

    可以将针对数值阵列描述的所有类型的索引应用于单元数组,还有一个额外的考虑 . 单元格数组可以用括号或花括号索引 . 在第一种情况下,索引的结果是单元阵列 . 在第二个中,它是以逗号分隔的单元格内容列表 .

    例如,假设前面示例中使用的数值数组转换为单元格数组 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中使用的索引将产生单元阵列

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

    逻辑和线性索引不是唯一的索引类型 . 相反,它们是索引的两个独立功能 . “逻辑”是指索引值的类型,“线性”表示多个维度正在折叠并索引为一个维度 . 这两个功能可以同时发生 .

相关问题