9/27/2006

2.9 矩陣之排序

矩陣中各元素之大小之排列與排序也是重要的操作。部份依需求而不同,有時需升冪排例(ascend),有時要降冪排列(descend),有時則只依其中某些行或某些列進行排列。排序之基本型式如下:


B = sort(A,dim)
B = sort(A,dim,mode)
[B,IX] = sort(A)

其中參數dim代表的意義與前面相同。dim=1時,是依行向排序;dim=2時,則是是依列向排序。前者為預設值,故不輸入亦可。參數mode則代表排列的方式,若mode='ascend'時為升冪排列;mode='decend'時為降冪排列,前者為預設值。設A之內容可利用亂數產生如下,先各乘以100再進行四捨五入:

>>A=round(rand(3,4)*100) %using random function to find a 3X4 matrix
A =
95 49 46 44
23 89 2 62
61 76 82 79

因此,A是一個3x4的矩陣。首先進行任意升幂排序:

>>sort(A) % Sorting A in a columnwise and acending order
ans =
23 49 2 44
61 76 46 62
95 89 82 79

由其結果可以看出每一行都進行升冪排列,故所有的順序都改變了。現在以列向排序,並且採降冪排列:

>>sort(A,2,'descend') % Sorting A rowwise and in a decending order
ans =
95 49 46 44
89 62 23 2
82 79 76 61

審視其結果,與原矩陣A相較,應符合原先的設定與應用。

此外,若還要知道原來元素移動之前的位置時,則可在函數左邊設定兩個輸出參數,前一項代表排序後的內容,後一項則為該元素在排序前所在的位置(行或列)。

>> [B,ix]=sort(A)
B =
23 49 2 44
61 76 46 62
95 89 82 79

ix =
2 1 2 1
3 3 1 2
1 2 3 3

如果要矩陣依某一行或某一列排序,其餘之行列元素則隨同移動,則可使用另一函數指令sortrows(A),其呼叫格式如下:

B = sortrows(A,column)

>>[B,IX] = sortrows(A)

這個排序函數僅能依行,若要依列排序可先將A倒置。column代表所要排的那一行,如果不說明,則預設為第一行。其中B與IX之定義與sort函數相同,惟此處僅代表指定排序的那一行元素原先之位置。

>>[B,IX]=sortrows(A)

B =
23 89 2 62
61 76 82 79
95 49 46 44

IX =
2
3
1


讀者可就其結果與先前之矩陣A相印證。