在科學與工程計算、機器學習、圖形學等眾多領域中,矩陣是一種基礎且重要的數據結構。當矩陣中非零元素(或特定值元素)的數量遠少于零元素(或默認值元素)的數量時,我們稱之為“稀疏矩陣”。例如,一個1000×1000的矩陣中,可能只有不到1%的元素是非零的。如果使用傳統的二維數組來存儲這樣的矩陣,將浪費大量的存儲空間來存放零值,并且在運算時也會進行大量無效的零值操作,效率低下。因此,針對稀疏矩陣,發展出了一系列高效的壓縮存儲方法。
稀疏矩陣沒有嚴格的數學定義。通常,當一個矩陣的稀疏度(非零元素個數與總元素個數的比值)低于一個經驗閾值(例如5%或0.5%)時,就可以認為是稀疏的。其核心特性是:
正是這些特性,使得我們可以放棄存儲每一個元素,轉而只存儲非零元素的值及其位置信息,從而達到壓縮的目的。
這是最直觀的壓縮方法。我們使用三個一維數組來分別存儲:
data:所有非零元素的值。row:每個非零元素對應的行號(從0或1開始)。col:每個非零元素對應的列號。示例:
對于一個矩陣:
[ 1 0 0 ]
[ 0 0 5 ]
[ 0 2 0 ]
其三元組表示為(假設行、列索引從0開始):data = [1, 5, 2]row = [0, 1, 2]col = [0, 2, 1]
優點:結構簡單,容易構造,適用于非零元素隨機分布的矩陣。
缺點:不便于進行矩陣運算(如轉置、乘法),因為訪問特定行或列需要遍歷整個數組。
這是最常用、最高效的通用稀疏矩陣存儲格式之一。它同樣使用三個數組:
data:所有非零元素的值,按行優先順序排列。indices:每個非零元素對應的列號。indptr(或row_ptr):行指針數組。其長度為行數+1。indptr[i]表示第i行第一個非零元素在data和indices中的起始索引,indptr[i+1]是其結束索引。因此,第i行的非零元素存儲在data[indptr[i]: indptr[i+1]]中。示例(同上矩陣):data = [1, 5, 2] // 第一行的1,第二行的5,第三行的2indices = [0, 2, 1] // 分別對應的列號indptr = [0, 1, 2, 3] // 第0行從索引0開始(有1個元素),第1行從索引1開始(有1個元素),第2行從索引2開始(有1個元素),結束于3。
優點:高效支持按行訪問、矩陣-向量乘法等操作。內存訪問模式連續,緩存友好。
缺點:構建和修改(插入/刪除非零元)成本較高。
CSC是CSR的列優先版本,原理完全相同,只是將“行”換成了“列”。它使用:
data:所有非零元素的值,按列優先順序排列。indices:每個非零元素對應的行號。indptr:列指針數組。優點:高效支持按列訪問、向量-矩陣乘法、矩陣轉置(CSR轉CSC即相當于轉置)等操作。
除了上述通用格式,還有一些針對特殊稀疏模式的格式:
在編程實踐中,我們通常不會手動實現這些結構,而是使用成熟的科學計算庫:
scipy.sparse 模塊提供了 coo<em>matrix, csr</em>matrix, csc<em>matrix, dia</em>matrix 等多種格式,并能高效地進行轉換和運算。稀疏矩陣的壓縮存儲是平衡空間與時間效率的關鍵技術。選擇哪種格式取決于:
理解這些核心格式的原理,有助于我們在處理大規模稀疏數據時,選擇合適的工具和策略,從而設計出高效、節省內存的算法與程序。
如若轉載,請注明出處:http://m.tangdingblog.cn/product/24.html
更新時間:2026-06-19 00:48:07