1. 稀疏矩陣稀疏矩陣的計算機存儲
在計算機存儲中,稀疏矩陣的特性使其在處理大量元素為零的情況時顯得尤為高效。當Matlab將矩陣視為稀疏矩陣時,存儲策略發生了改變。通常,矩陣的存儲僅需關注非零元素,而非全矩陣。具體來說,這種存儲方式採用一個m×3的矩陣,其中第1列存儲行下標,第2列存儲列下標,第3列則是非零元素的值。每個非零元素佔用8個位元組(相當於高斯節),而下標則需要4個位元組。因此,對於一個包含m個非零元素的矩陣,總的內存佔用為16位元組乘以m。
以矩陣A為例,其元素為(1,0,0,0),形成一個1×1的單位矩陣,常規存儲需要8兆位元組(Mb)。然而,如果使用`sparse`命令,我們可以將其表示為一個1×3的矩陣,每行僅包含一個元素的行下標、列下標和值。這樣,存儲這個單位矩陣只需16千位元組(Kb),相比於常規存儲,節省的空間達到了99.8%。這種方法同樣適用於許多具有大量零元素的廣義矩陣,極大地節省了存儲空間。
(1)實現稀疏矩陣存儲擴展閱讀如果在矩陣中,多數的元素為0,稱此矩陣為稀疏矩陣(sparse matrix)。
2. 特殊矩陣的壓縮存儲(稀疏矩陣的鏈式存儲)
在計算機科學領域,特殊矩陣的存儲是一個重要話題,尤其是對於稀疏矩陣。稀疏矩陣的特點是其中大部分元素為零,因此傳統的二維數組存儲方式會浪費大量的存儲空間。針對這一問題,我們可以採用壓縮存儲方式,尤其是鏈式存儲,以提高存儲效率。
一、參數解釋
在壓縮存儲稀疏矩陣時,我們主要關注三個參數:非零元素的數量、矩陣的行數和列數。通過這些參數,我們可以構建一個緊湊的存儲結構,僅存儲非零元素的位置和值。
二、邏輯結構
邏輯上,我們可以將稀疏矩陣表示為一個鏈表結構。每個節點代表矩陣中的一個非零元素,包含元素的位置(行和列)和值。鏈表的頭節點通常包含矩陣的行數和列數。通過這種方式,我們有效地壓縮了存儲空間,因為只存儲了非零元素的信息。
三、代碼實現
實現代碼時,首先定義一個節點類,包含元素的位置(行和列)和值。接著構建一個鏈表,用於存儲所有非零元素。在插入元素時,檢查該元素是否已存在於鏈表中,以避免重復存儲。最後,可以通過遍歷鏈表,以二維數組的形式輸出矩陣。
四、總結
壓縮存儲,特別是鏈式存儲,對於稀疏矩陣是非常有效的解決方案。它不僅節省了存儲空間,還簡化了矩陣的讀取和操作。通過合理設計,我們能夠以較低的時間復雜度實現矩陣的高效操作。
五、課程鏈接
如果您想了解更多關於數據結構與演算法的知識,特別是特殊矩陣的壓縮存儲,可以訪問以下鏈接:數據結構與演算法基礎(青島大學-王卓)_嗶哩嗶哩_bilibili
3. 稀疏矩陣定義以及存儲格式(COO,CSR,CSC)
網路:在矩陣中,若數值為0的元素數目遠遠多於非0元素的數目,並且非0元素分布沒有規律時,則稱該矩陣為稀疏矩陣;與之相反,若非0元素數目佔大多數時,則稱該矩陣為稠密矩陣。定義非零元素的總數比上矩陣所有元素的總數為矩陣的稠密度。 簡單來說,稀疏矩陣就是絕大部分都是0的矩陣 ,只包含很少的非零值.
比如,
上述稀疏矩陣非零元素有9個,26個零值.稀疏性是74%.
稀疏矩陣因為絕大部分都是0元素,如果我們仍然按照普通方式存儲,無疑會 浪費很多空間 ;同時如果進行運算時,0元素對最終結果也沒有幫助, 增加了許多無效計算 . 因此,我們需要設計出新的存儲方式,或者說數據結構來存儲稀疏矩陣.比較常見的有:
對於稀疏矩陣的存儲,為了達到壓縮的目的(節省存儲空間),只存儲非0元素值,但是也要保留非零元素的位置,方便恢復.所以,我們存儲時不僅存儲非零元素值,同時存儲其坐標位置(row,column). 針對這兩者的存儲,會出現不同的設計方案.這里主要介紹COO,CSR和CSC存儲格式.
我們使用三個數組row,column和data分別用來存儲非零元素坐標的row_index,col_index,以及數值.比如:
NNO:The number of nonzero.矩陣非零元素個數. 三個數組的長度都是NNO.data[i]在原稀疏矩陣中的坐標為(row[i],col[i]]).
可以發現,這種存儲方式中,row數組和column數組中有一定的重復元素.我們是否可以針對這個冗餘特性進一步進行壓縮?之後出現CSR,CSC,分別是對row數組和column數組進行了壓縮.
對COO稀疏矩陣存儲格式的三個數組中的row數組進行壓縮.其他兩個數組保持不變;三個數組分別是row_ptr,columns和data.其中columns和data數組長度均為NNO(矩陣的非零元素個數). 如何對COO的row進行壓縮?
row_ptr存儲的是每行的第一個非零元素距離稀疏矩陣第一個元素的偏移位置;
由row_ptr我們可以知道每行非零元素在data中的index范圍.第i行的非零元素為data[row_ptr[i]:row_ptr[i+1]],對data數組的切片,不包含data[row_ptr[i+1]];同時第i行非零元素的col坐標分別為columns[row_ptr[i]:row_ptr[i+1]];對data和columns的訪問相似,index是相同的.
如上圖中,第0行非零元素在data中是data[0:2],就是1,7;列坐標為columns[0:2],就是0,1,第1行非零元素為data[2:4],有兩個元素2和8,列坐標分別為columns[2:4],1和2.
方便進行行操作.
和CSR類似.只不過對列進行壓縮,row和data保持不變.
方便進行列操作.
4. 稀疏矩陣的壓縮存儲方式有
順序存儲、三元組表和十字鏈表。
1、順序存儲:將矩陣按照行號順序依次存儲,每一行的非零元素按照列號順序依次存儲。這種方式適用於行數較少,且行內非零元素分布較為均勻的稀疏矩陣。
2、三元組表:這是一種更為緊湊的存儲方式,使用三個數組分別存儲非零元素的行號、列號和值。假設矩陣中有m行n列,非零元素個數為nz,則三個數組的長度分別為mz、nz和nz。這種方式適用於行數較多,且行內非零元素分布不均勻的稀疏矩陣。
3、十字鏈表:這是一種鏈式存儲方式,通過鏈表結構將每一行的非零元素連接起來,同時記錄其列號和值。這種方式適用於需要頻繁進行插入和刪除操作的稀疏矩陣。