簡體   English   中英

線性索引、邏輯索引等等

[英]Linear indexing, logical indexing, and all that

我們習慣了 Matlab 中不同形式的索引:

  • 標准(沿每個維度使用整數),
  • 邏輯(使用邏輯值),
  • 線性(使用單個索引遍歷多維數組)。

乍一看,這些形式似乎是排他的:索引要么是標准的,要么是邏輯的,要么是線性的。 然而,有時這些形式中的幾種似乎是混合的。 例如,

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

在此表達式中,標准(整數值)索引用於第一個坐標,邏輯索引用於第二個坐標。

這些示例(以及實踐中出現的更復雜的示例)提出了以下問題:

  • Matlab 中有哪些類型的索引?
  • 它們如何結合?
  • 應該如何稱呼它們?

在下文中,我使用我認為或多或少符合標准 Matlab 實踐的術語 然而,在某些情況下,我不得不編造一個名字,因為我不知道現有的名字。 請讓我知道是否有比我使用的更多的標准名稱。

這個答案試圖闡明不同類型的索引以及它們如何組合。 另一個問題是如何將輸出數組的形狀size )確定為索引變量形狀的函數。 Loren Shure 的Essence of indexing是一篇關於此的好文章。

下面的說明中重在數值陣列的索引,但它可以被(分別為單元陣列或逗號分隔的列表,)施加到單元陣列與任一括號或大括號索引,與輸出類型的明顯變化。 這將在最后簡要討論。

數值數組中的索引類型

可以考慮以下兩個屬性對索引進行分類。

  1. 根據每個索引變量所指的維數,索引可以是多維的,也可以是線性的。 但這只是兩種極端情況。 存在一種中間情況,可以稱為部分線性索引:

    • 多維索引為數組的每個維度指定一個索引變量。 個別索引有時在 Matlab 文檔中被稱為下標(參見例如sub2ind )。
    • 線性索引指定了一個索引變量,它在所有維度上遍歷數組(這可以被視為所有維度都合並為一個)。 正如我們所知,遍歷首先是沿着列,然后是行,然后是第三維度的切片,等等(所謂的列主序)。
    • 部分線性索引:給定一個具有m+n維的數組, n>=2 ,可以為前m維度指定m索引變量(因此在這些維度中使用多維索引),並為最后n維度指定一個索引變量,即僅解釋為這些維度的線性索引(最后n維度合並為一個)。
  2. 根據索引值的類型,每個索引變量可以是整數值或邏輯值:

    • 如果索引變量包含正整數,則它是整數值
    • 如果索引變量包含邏輯值,這是合乎邏輯的。

分類標准 1 和 2 是獨立的 從標准 1 的角度來看,指數的類別與其根據標准 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
  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

    缺失值被解釋為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

在多維或部分線性索引中,其中有多個索引變量,每個變量都可以獨立為整數值或邏輯值。 這就產生了不同的混合類型 例如:

  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

如果被索引的數組是一個稀疏矩陣,上述所有內容仍然適用,除了矩陣不存在部分線性索引; 當然結果也是稀疏的。

元胞數組的索引

為數值數組描述的所有索引類型都可以應用於元胞數組,但有一個額外的考慮。 元胞數組可以用圓括號或花括號索引。 在第一種情況下,索引的結果是一個元胞數組。 第二個是逗號分隔的單元格內容列表。

例如,假設將前面示例中使用的數值數組轉換為元胞數組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

邏輯索引和線性索引並不是唯一的索引類型。 相反,它們是索引的兩個獨立特征。 “邏輯”是指索引值的類型,“線性”表示多個維度被折疊並索引為一個。 這兩個功能可以同時發生。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM