參差不齊的矩陣

其實,參差不齊的矩陣根本不應該叫做矩陣。 所謂矩陣,必須有 m 列、有 n 行;亦即每列每行都要一樣「長」。 如果可以用補零的方法,當然可以將不整齊的元素放進矩陣。 例如現在想要放三個行向量到一個矩陣,第一行有 6 個元素, 第二行有 4 個,第三行有 5 個。我們可以宣告一個 6x3 的矩陣, 在每一行不滿的地方補零。如下

C = zeros(6,3);
C(:,1)=(1:6)';
C(1:4,2)=(7:10)';
C(1:5,3)=(11:15)';
但是這顯然不是一個令人滿意的辦法。

根本的解決之道是採用另一種資料結構:Cell Array (房間序列)。 房間序列可以是一維、二維或更高維的,序列中的每個元素是一個「房間」, 每個房間可以有各自的資料型態。 例如一個 1x3 的房間序列,第一個元素可以是維度 6 的向量, 第二個元素是維度 4 的向量, 第三個元素是維度 5 的向量。 房間序列的元素像普通序列一樣,是從 1 開始編號的正整數, 但是要寫在一對大括號裡面。 循上例,用房間序列可以寫成

C{1}=(1:6)';
C{2}=(7:10)';
C{3}=(11:15)';
C{1} 就取得
        1
        2
        3
        4
        5
        6
這個向量。

但是 Matlab 不能「跨房間」取得資料。例如不再能用 C{1,:} 取得每個房間的第一個元素。因為剛才定義的那個房間序列是一維序列, 上述語法是針對二維序列而言。例如以下是一個二維房間:

D = { (1:3) pi; magic(3) 'Cell Array' };
D{2,2} 的值是字串 Cell Array, 而 D{:,1} 是它的第一行元素,依序是一個 1x3 列向量和一個 3x3 方陣:
ans =

     1     2     3


ans =

     8     1     6
     3     5     7
     4     9     2

甚麼情況使我想要用 cell?例如,現在我要計算 12 個微積分班級各別的成績統計, 所以要對 12 個向量分別做一批同樣的計算。 顯然這 12 個向量的維度各自不同,有個班級只有 21 人,有個班級有 100 人。 我如果把這 12 個向量分別命名,處理的時候比較不容易自動化, 或者我需要一些字串處理的技巧。 但是我如果把它們設定成房間序列,則可以用 for n=1:12, C{n} 這種語句來整批處理全部班級。

[ 前一節 ]‧[ 後一節 ]‧[ 回目錄 ]



注意:此處所有文件均為原著,個別的版權宣告日後會一一公布, 整體版面設計亦尚未完成。但仍請勿抄襲文字與圖片,以免觸犯著作權法。

Created: July 1, 2007
Last Revised:
© Copyright 2007 Wei-Chang Shann 單維彰

shann@math.ncu.edu.tw