對於一個只包含實數的稀疏矩陣,假設其維度為 m×n,含有 nnz 個非零元素,MATLAB 動用了三個內部陣列來儲存此稀疏矩陣的相關資訊:
- 第一個陣列:以 double 方式儲存了所有的非零元素,其長度為 nnz,使用的空間為大小 8*nnz 位元組(Bytes)。
- 第二個陣列:以長整數方式儲存了每個元素的列索引,其長度為 nnz,使用的空間大小為 8*nnz 位元組(Bytes)。
- 第三個陣列:以長整數方式儲存了每個直行的起始指標,其長度為 n,使用空間大小為 8*n 位元組(Bytes)。
因此,整個稀疏矩陣內存空間大小為 8*nnz + 8*nnz + 8*n + 8 = 16*nnz + 8*n + 8,多出來的 8 個 bytes 是用來儲存其他經常性資訊。以 MATLAB 的 west0479.mat 檔案為例,此檔案包含一個 479×479 的稀疏矩陣,我們可以驗證上述內存空間公式如下:
由上例可知,我們由上述內存空間公式所得到的結果,和 whos 指令所得到的結果是一致的。此外在上例中,nnz(west0479) 可傳回稀疏矩陣 west0479 的非零元素個數,其他類似的指令還有 nonzeros(傳回一個包含所有非零元素的行向量)及 nzmax(傳回最大的非零元素個數)。
上述的內存空間公式會隨著 MATLAB 的版本而有所改變,所以決定內存空間公式的最好方式是直接對 MATLAB 進行測試,範例如下:
在上例中,我們事實上是在解一個線性方程式 Ax=b,其中我們使用了 100 個稀疏矩陣來產生 A,A 包含四個直行,每一個直行分別代表這 100 個稀疏矩陣的 nnz(非零元素個數)、m(橫列個數)、n(直行個數),以及常數 1,而 b 則是這幾個稀疏矩陣的內存空間大小。由上述範例所得到的預測誤差相當小,因此由 x 的值就可以知道每一個特徵(nnz、m、n)所佔用的內存空間分別是(16、0、8),而每一個稀疏矩陣還會用到 8 個位元組來儲存經常性資訊。
MATLAB程式設計:進階篇