1. 程式人生 > >MATLAB中的邏輯索引與陣列索引

MATLAB中的邏輯索引與陣列索引

常見矩陣元素索引方法

矩陣作為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的維數並不相同。

參考文獻

  1. 張志湧, 楊祖櫻. MATLAB教程(R2006a-R2007a)[M]. 北京:北京航空航天大學出版社, 2006. 8