如果某矩陣大部分的元素為零, 只有少部分的非零元素, 那麼一個比較有效率的做法是不要將整個矩陣的元素都存下來, 只需要存非零部分就好. 這種矩陣稱為稀疏矩陣(sparse matrix).
舉例來說, 以下這矩陣只有對角線部分有值, 其他皆為零,
執行結果為:
可以看出兩種作法的差別, 記全部元素, 則只記非零的部分.
再來試更大的矩陣, 這次是 :
可以看出 跟 都是 的矩陣, 不過所需要存的記憶體則有約三千倍的差別 (Bytes 那欄).
所以, 如果一個矩陣很稀疏, 那就務必存成稀疏矩陣的格式.
再舉個例子, 假設我們想解
其中 是個只有對角線有值的矩陣, , 則是個向量, .
是個 矩陣, 我們有三種作法來解這問題. 先分別將三種作法所需要的矩陣造出來:
以下我們要分別計時一下, 看三種做法速度差多少
因為我們知道這問題的解是
因此我們可以這樣做 (也就是直接把 向量點除矩陣對角線向量):
第一次 run 程式時間會比較長, 建議多跑幾次取時間的平均. 我所得的時間為
我們知道解線性系統 問題在 matlab
裡的指令為 x = b\D
, 所以我們就這樣做:
結果是
第三種一樣是反除, 只不過我們這次是反除那個稀疏矩陣
結果是
可以看出, 直接做跟對稀疏矩陣反除效果都很好, 不過對整個大矩陣反除就慢多了.
以上這種將矩陣造出, 再 sparse
變成稀疏矩陣的作法純屬課堂效果, 絕對不可以用.
不過我們還是介紹兩個指令:
sparse
: 如同前面的例子, 將一個矩陣轉成稀疏矩陣
full
: 這是反過來, 將一個稀疏矩陣變成一般矩陣
生成稀疏矩陣有幾個重要指令:
speye
: sparse identity matrixspeye(m, n)
: 生成一個稀疏的 矩陣, 其中主對角線都是 , 其餘所有元素都是 .
spdiags
: sparse matrix formed from diagonalsspdiags(B,d,m,n)
: 生成一個 的稀疏矩陣, 是個 向量, 則是要將這向量放在哪個位置, 表示對角線, 表示對角線往上移一排, 則表示對角線往下移一排.
以下兩個範例:
改寫 Jacobi method 的程式, 確保他執行速度夠快.
使用 Jacobi method 來解以下問題, ,
其中