依儲存方式的不同,MATLAB 的矩陣可分為兩種:完全矩陣(Full Matrix)與稀疏矩陣(Sparse Matrix), 一般我們看到的 MATLAB矩陣都是完全矩陣,其中每一個元素都存成 double 的資料型態,佔用 8 個 Byte, 因此一個 m×n 的完全矩陣,所佔用的記憶體空間是 8×m×n 個 Byte。但在稀疏矩陣中,由於大部分的元素都是0, 因此只須儲存「非零元素的位置」及其「元素值」即可,這種特殊的內部儲存方式有下列兩大優點:
- 節省記憶體儲存空間。
- 節省許多不必要的運算。
MATLAB 的 sparse 指令可將一個完全矩陣轉換成稀疏矩陣,例如:
由此可看出,S 是一個稀疏矩陣,MATLAB 只儲存其各個非零元素的位置(即其二維下標 (1,1)、(3,2)、(2,4)) 和元素值(1、4、3)。若要比較矩陣 A 和 S 所佔用的記憶體大小,可輸入如下:
由此可驗證稀疏矩陣 S 佔用記憶體的位元組數目(96 Bytes)比矩陣 A(120 Bytes)小很多。
我們也可以使用 sparse 指令來直接產生稀疏矩陣,其使用語法如下:
S = sparse(i, j, s, m, n);
其中 i 是列索引,j 是行索引,s 是非零元素所形成的向量,m 是 s 的列維度,n 是 s 的行維度。 i、j、s 都是長度相同的向量,s(k) 的二維下標即是 i(k)及 j(k)。例如,以下語法可以產生與前例相同的稀疏矩陣 S:
您也可以在 sparse 指令加上第六種輸入變數,代表最多可以容納的非零元素個素,使得您可以後續再加入非零元素, 而不必改變整個稀疏矩陣的結構。
MATLAB 提供了另一個指令 spdiags,可由對角線元素來建構一個稀疏矩陣,其一般格式如下:
S = spdiags(D, d, m, n)
其中 D 的每一個直行代表矩陣的對角線向量,d 代表對角線的位置(0 代表主對角線,-1 代表向下位移一單位的次對角線, 1 代表向上位移一單位的次對角線,依此類推),m 與 n 則分別代表矩陣的列維度與行維度。例如:
由此可看出 D 的兩個行向量 [2 4 1]' 及 [7 9 3]',分別是矩陣 A 的兩個對角線向量,一個位於主對角線之上,另一個位於主對角線之下。(但在矩陣 D 的第一行向量中,我們只用到了第二及第三個元素,第一個元素則因超越矩陣邊界範圍而被「砍掉了」!)
一般的 load 及 save 指令,也可以處理稀疏矩陣,並儲存於二進制的 MAT 檔案。另一個常用到的指令是 spconvert, 可將一個 m×3 的矩陣轉換成稀疏矩陣,其中第一直行代表列索引,第二直行代表行索引,第三直行則是非零的元素值。 例如:
在上述範例中,spmat 的第一及第二直行代表稀疏矩陣的橫列索引及直行索引,第三直行則是元素值,經由 spconvert,我們即可建構此稀疏矩陣。
MATLAB程式設計:進階篇