
使用稀疏座標矩陣的列聯表 |
125
不幸地,即使 COO 格式很直觀,它還是無法最小化記憶體的使用,也無法在計算時將
穿越陣列的次數儘可能的減少。(還記得在第一章時看過,
data locality
對於計算效率的
影響吧)不過,當你看著你寫出的 COO 的結果,還是能幫助識別出冗餘資訊,例如那
些重複的 1。(譯註:指練習題解答)
壓縮稀疏列格式
如果我們使用 COO 時,用一列列的順序例出非 0 的項目,而不是任意跳來跳去的話
(這種格式也支援),最後我們的 row 陣列就會有很多連續又重複的值(譯按:如同
練習題裡第 1 row 有 4 個連續的 1)。我們可以將這些連續重複的值在下列開始時壓縮
在
col
索引
之中,而不是一直重複的寫列索引,這就是
壓縮稀疏列
(
compressed sparse
row
,
CSR
)格式的基本精神。
再一次用上面的範例舉例,如果是 CSR 格式,
col
和
data
陣列不會變(但
col
會改名為
indices
)。然後,
row
陣列改為用來指出
col
中
何處
為列的開頭處,並將 row 陣列改名
為
indptr
,意思是索引指標(index pointer)。
那麼,讓我們看一下 COO 格式中的
row
和
col
陣列,先不管
data
陣列:
row = [0, 1, 1, 1, 1, 2, 3, 4, 4]
col = [2, 0, 1, 3, 4, 1, 0, 3, 4]
每次
row
中的值改變時,就是一個列的開頭,第 0 列從索 0 引開始,而第 1 列由索引 1
開始,但是第 2 列,是在