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