[英]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 實踐的術語。 然而,在某些情況下,我不得不編造一個名字,因為我不知道現有的名字。 請讓我知道是否有比我使用的更多的標准名稱。
這個答案試圖闡明不同類型的索引以及它們如何組合。 另一個問題是如何將輸出數組的形狀( size
)確定為索引變量形狀的函數。 Loren Shure 的Essence of indexing是一篇關於此的好文章。
下面的說明中重在數值陣列的索引,但它可以被(分別為單元陣列或逗號分隔的列表,)施加到單元陣列與任一括號或大括號索引,與輸出類型的明顯變化。 這將在最后簡要討論。
可以考慮以下兩個屬性對索引進行分類。
根據每個索引變量所指的維數,索引可以是多維的,也可以是線性的。 但這只是兩種極端情況。 存在一種中間情況,可以稱為部分線性索引:
根據索引值的類型,每個索引變量可以是整數值或邏輯值:
分類標准 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
多維整數值:
>> 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
否則會發生錯誤。 例如,請參閱Mathworks 的此頁面或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
在多維或部分線性索引中,其中有多個索引變量,每個變量都可以獨立為整數值或邏輯值。 這就產生了不同的混合類型。 例如:
多維,邏輯/整數值:
>> 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
邏輯索引和線性索引並不是唯一的索引類型。 相反,它們是索引的兩個獨立特征。 “邏輯”是指索引值的類型,“線性”表示多個維度被折疊並索引為一個。 這兩個功能可以同時發生。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.