MATLAB中的邏輯索引與陣列索引
阿新 • • 發佈:2019-02-11
常見矩陣元素索引方法
矩陣作為MATLAB中的基本單位,靈活地實現對其元素的索引是有效處理矩陣的必要基礎。顯然地,MATLAB也的確提供了很多的矩陣元素索引方法12。常見的矩陣元素索引方法分別如下所示:
邏輯索引
邏輯索引通過使用元素為0或1的邏輯矩陣來索引矩陣a中的元素,因此它們的維數必須相同。具體例子如下:
>> a = [1:3;4:6;7:9]
a =
1 2 3
4 5 6
7 8 9
>> threshold = a>5
threshold =
0 0 0
0 0 1
1 1 1
>> a(threshold) = 0
a =
1 2 3
4 5 0
0 0 0
也可以直接寫成如下形式:
>> a = [1:3;4:6;7:9]
a =
1 2 3
4 5 6
7 8 9
>> a(a>5) = 0
a =
1 2 3
4 5 0
0 0 0
陣列索引
根據參考書籍3中分類,陣列索引可以劃分為:單下標索引和多下標索引。單下標索引的具體例子如下:
>> a = 1:6
a =
1 2 3 4 5 6
>> a(3) = 5
a =
1 2 5 4 5 6
>> a([2,4])=[4,2]
a =
1 4 5 2 5 6
>> b = [1:3;4:6;7:9]
b =
1 2 3
4 5 6
7 8 9
>> b(:)
ans =
1
4
7
2
5
8
3
6
9
在MATLAB中,單個數值可以理解為一個元素的1×1的矩陣,因此參考文獻4中所謂的線性索引也不過是陣列索引的一種特例。從上邊的例子可以看出,單下標索引中的冒號索引可以實現多維矩陣的列向量化,這和多下標索引中的冒號索引又不盡相同。
多下標索引的例子具體如下:
>> a = [1:3;4:6;7:9]
a =
1 2 3
4 5 6
7 8 9
>> a(2,2) = 0
a =
1 2 3
4 0 6
7 8 9
>> a([1 3],[2 3])
ans =
2 3
8 9
>> a(:,1)
ans =
1
4
7
>> a(:,[1,3])
ans =
1 3
4 6
7 9
>> a(1,:)
ans =
1 2 3
>> a([1,3],:)
ans =
1 2 3
7 8 9
從上邊的例子可以看出,單下標索引和多下標索引的冒號索引的作用是不盡相同的。
綜上所述,MATLAB中矩陣元素的索引方法分為兩種:邏輯索引和陣列索引。其中,陣列索引又可以分為單下標索引和多下標索引,冒號索引在不同情況下表示的含義亦不盡相同。
兩者的區別和聯絡
邏輯索引要求索引矩陣必須和矩陣a的維數相同,而陣列索引則沒有這樣的要求。但是陣列索引中的單下標索引,又具有一些和邏輯索引的相同之處,通過下邊的例子來說明:
>> a = [1:3;4:6;7:9]
a =
1 2 3
4 5 6
7 8 9
>> threshold = a>5
threshold =
0 0 0
0 0 1
1 1 1
>> a(threshold)
ans =
7
8
6
9
>> b = [1:3;4:6;7:9]
b =
1 2 3
4 5 6
7 8 9
>> b(4)
ans =
2
>> b([5 7])
ans =
5 3
從上邊的例子可以看出,當對多維矩陣進行單下標索引時,會首先將矩陣b進行列向量化,然後再按順序選出其對應的元素。而邏輯索引也是預設進行列向量化後再按順序選出其對應的元素。
find函式本質是陣列索引
通過邏輯索引和陣列索引的區別和聯絡,我們將很容易得出find函式本質是陣列索引的結論,具體通過下邊的例子進行說明:
>> a = [1:3;4:6;7:9]
a =
1 2 3
4 5 6
7 8 9
>> threshold = a>5
threshold =
0 0 0
0 0 1
1 1 1
>> a(threshold)
ans =
7
8
6
9
>> a(threshold) = 0
a =
1 2 3
4 5 0
0 0 0
>> b = [1:3;4:6;7:9]
b =
1 2 3
4 5 6
7 8 9
>> index = find(b>5)
index =
3
6
8
9
>> b(index) = 0
b =
1 2 3
4 5 0
0 0 0
從上邊的例子可以明顯地看出,矩陣threshold是和矩陣a維數相同的邏輯矩陣,而矩陣index只是記錄了矩陣b列向量化後大於5的元素的索引,且和矩陣b的維數並不相同。
參考文獻
- 張志湧, 楊祖櫻. MATLAB教程(R2006a-R2007a)[M]. 北京:北京航空航天大學出版社, 2006. 8 ↩