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