gpt4 book ai didi

arrays - 线性索引,逻辑索引等

转载 作者:太空宇宙 更新时间:2023-11-03 19:06:13 25 4
gpt4 key购买 nike

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

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

  • 乍看起来,这些形式似乎是互斥的:索引是标准索引,逻辑索引或线性索引。但是,有时在这些形式中的几种之间似乎是混合的。例如,
    >> A = magic(3)
    A =
    8 1 6
    3 5 7
    4 9 2
    >> A(A>5)
    ans =
    8
    9
    6
    7

    这是逻辑索引,对吗?但是它还具有线性索引的某些功能,因为返回了列 vector 。实际上,逻辑索引 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

    在此表达式中,标准(整数值)索引用于第一个坐标,而逻辑索引用于第二个坐标。

    这些示例(以及在实践中出现的更复杂的示例)提出以下问题:
  • Matlab中有哪些类型的索引?
  • 如何合并?
  • 应该如何称呼它们?
  • 最佳答案

    在下文中,我使用术语,我认为它或多或少与标准Matlab惯例保持一致。但是,在某些情况下,由于我不知道现有名称,所以不得不对名称进行排序。请让我知道是否有比我正在使用的标准名称更多的标准名称。

    该答案试图阐明索引的不同类型以及如何将它们组合在一起。一个不同的问题是如何根据索引变量的形状确定输出数组的形状(size)。 Loren Shure的Essence of indexing是一个很好的帖子。

    下面的描述集中于对数值数组的索引,但是它可以应用于带有括号或大括号索引的单元格,其输出类型有明显变化(分别为单元格数组或逗号分隔列表) 。最后将对此进行简要讨论。

    数值数组中的索引类型

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

  • 根据每个索引变量所指的维数,索引可以是多维的或线性的。但这只是两个极端情况。存在一种中间情况,可以称为部分线性索引:
  • 多维索引为数组的每个维指定索引变量。在Matlab文档中,有时将各个索引称为下标(例如,参见 sub2ind )。
  • 线性索引指定了一个索引变量,该变量在所有维度上遍历数组(可以将其视为所有维度都折叠为一个)。众所周知,遍历首先是沿着列,然后是行,然后是第三维 slice ,等等(所谓的column-major order)。
  • 部分线性索引:给定一个具有m+n维的数组n>=2,可以为第一个m维指定m索引变量(因此在这些维中使用多维索引),为最后一个n维指定一个索引变量。仅针对这些维度的线性索引(最后一个n维度折叠为一个)。
  • 根据索引值的类型,每个索引变量可以是整数值或逻辑值:
  • 如果索引变量包含正整数,则为整数值;否则为。
  • 如果索引变量包含逻辑值,则为逻辑

  • 分类标准1和2是 独立。从准则1的 Angular 来看,索引的类别与其与准则2的类别无关。所有组合都是可能的。

    因此,根据以上分类,索引有6种 基本类型。为了澄清,下面是每个示例。所有示例均使用 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

    (请注意,索引 vector 中已省略11个尾随的false值。)
  • 部分线性,逻辑:
    >> A([true true false], [false true true true false false])
    ans =
    1 6 17
    5 7 12

  • 在多维索引或部分线性索引中,其中有多个索引变量,每个索引变量可以独立为整数值或逻辑值。这产生了不同的 混合类型。例如:
  • 多维,逻辑/整数值:
    >> 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

  • 如果要建立索引的数组是 稀疏矩阵,则上述所有内容仍然适用,只是矩阵不存在部分线性索引;当然结果也很少。

    单元格索引

    出于其他考虑,可以将为数字数组描述的所有索引类型应用于单元数组。单元格数组可以用括号或大括号索引。在第一种情况下,索引的结果是一个单元数组。第二个是单元格内容的逗号分隔列表。

    例如,假设前面示例中使用的数字数组转换为单元格数组 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

    逻辑索引和线性索引不是索引的排他类型。相反,它们是索引的两个独立特征。 “逻辑”是指索引值的类型,“线性”是指多个维被折叠并索引为一个维。这两个功能可以同时发生。

    关于arrays - 线性索引,逻辑索引等,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32379805/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com