當前位置:首頁 » 存儲配置 » 存儲稀疏矩陣方法

存儲稀疏矩陣方法

發布時間: 2022-11-04 14:01:57

① 如何用行邏輯鏈接順序表及十字鏈表存儲稀疏矩陣

來自
嚴蔚敏《數據結構》
稀疏矩陣的壓縮方法主要有:
1:三元組順序表
(行下標,列下標,值)
2:行邏輯鏈接的順序表。
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保持不變.

方便進行列操作.

③ 如何建立一個稀疏矩陣並存儲

//創建稀疏矩陣M
Status CreateSMatrix(TSMatrix * M)
{
int i,m,n;
ElemType e;
Status k;
printf("請輸入矩陣的行數,列數,非零元素數:");
scanf("%d,%d,%d",&(* M).mu,&(* M).nu,&(* M).tu);
if ((* M).tu > MAX_SIZE)
{
return ERROR;
}
(* M).data[0].i = 0;
for (i=1;i<=(* M).tu; ++i)
{
do
{
printf("請按行序順序輸入第%d個非零元素所在的行(1-%d),列(1-%d),元素值:",i,(* M).mu,(* M).nu);
scanf("%d,%d,%d",&m,&n,&e);
k = 0;
if (m<1 || m>(* M).mu || n<1 || n>(* M).nu)//行或列超出范圍
{
k = 1;
}
if (m<(* M).data[i-1].i || m==(* M).data[i-1].i && n<=(* M).data[i-1].j)//行或列的順序有錯
{
k = 1;
}
}while (k);
(* M).data[i].i = m;
(* M).data[i].j = n;
(* M).data[i].e = e;
}
return OK;
}

④ 稀疏矩陣一般的壓縮存儲方法有兩種

1.三元數組存儲(行,列,值)
2.行指針鏈表(第一列為數組,用指針鏈接到本行下一個有意義的位置)
3.十字鏈表(實在是太復雜了...)

⑤ 稀疏矩陣的壓縮存儲思想

為了節省存儲空間並且加快處理速度,需要對這類矩陣進行壓縮存儲,壓縮存儲的原則是:不重復存儲相同元素;不存儲零值元素。稀疏矩陣,有三元組表示法、帶輔助行向量的二元組表示法(也即行邏輯鏈表的順序表),十字鏈表表示法等。演算法基本思想:num[col]:第col列的非零元素個數;cpot[col]:第col列第一個非零元在b.data中的恰當位置;在轉置過程中,指示該列下一個非零元在b.data中的位置。

⑥ 稀疏矩陣是怎樣存儲的

/*
稀疏矩陣的三元組順序表存儲表示
*/
# define MAX_SIZE 100//非零元個數的最大值
struct Triple
{
int i,j;//行下標,列下標
ElemType e;//非零元素值
};
struct TSMatrix
{
Triple data[MAX_SIZE+1];//非零元三元組表,data[0]未用
int mu,nu,tu;//矩陣的行數、列數和非零元個數
};

⑦ 稀疏矩陣的三種存儲方式

常見的有三元組表示法、帶輔助行向量的二元組表示法(也即行邏輯鏈表的順序表),十字鏈表表示法

⑧ 三元組表示稀疏矩陣是什麼

三元組表示稀疏矩陣如下:

從方法上講,所謂的三元組法表示稀疏矩陣是:將非零元素所在的行、列以及它的值構成一個三元組(i、j、v),然後再按某種規律存儲這些三元組,這種方法可以節約存儲空間。

對於稀疏矩陣,採用壓縮存儲方法時,只存儲非0元素。必須存儲非0元素的行下標值、列下標值、元素值。因此,一個三元組唯一確定稀疏矩陣的一個非零元素。

稀疏矩陣和三元組的特點:

稀疏矩陣的概念是:一個m行n列的矩陣,若它的非零元個數特別少,即可稱它為稀疏矩陣。只存儲稀疏矩陣的非零元。除了存儲非零元的值a以外,還必須記下它的行下標i和列下標j。反之,一個三元組唯一確定矩陣的一個非零元。因此,一個稀疏矩陣可由一個三元組數組和該矩陣的行列數來確定。

⑨ 稀疏矩陣的壓縮存儲方法有

稀疏矩陣的壓縮存儲,數據結構提供有 3 種具體實現方式:
三元組順序表;
行邏輯鏈接的順序表;
十字鏈表;

⑩ 稀疏矩陣的壓縮存儲只需要存儲什麼

非零元素。

對於一個用二維數組存儲的稀疏矩陣Amn,如果假設存儲每個數組元素需要L個位元組,那麼存儲整個矩陣需要m*n*L個位元組。但是,這些存儲空間的大部分存放的是0元素,從而造成大量的空間浪費。為了節省存儲空間,可以只存儲其中的非0元素。

(10)存儲稀疏矩陣方法擴展閱讀

稀疏矩陣演算法的最大特點是通過只存儲和處理非零元素從而大幅度降低存儲空間需求以及計算復雜度,代價則是必須使用專門的稀疏矩陣壓縮存儲數據結構。稀疏矩陣演算法是典型的不規則演算法,計算訪存比很低,並且計算過程中的訪存軌跡與稀疏矩陣的稀疏結構相關。

熱點內容
話嘮安卓哪裡下載 發布:2025-05-19 20:27:04 瀏覽:164
瘋狂android講義光碟 發布:2025-05-19 20:12:31 瀏覽:152
安卓手機怎麼下載圈點 發布:2025-05-19 20:08:11 瀏覽:472
文件夾粉碎不了 發布:2025-05-19 20:05:41 瀏覽:242
安卓怎麼把軟體放進全局 發布:2025-05-19 20:03:55 瀏覽:687
安卓手機如何看最真實的型號 發布:2025-05-19 19:58:59 瀏覽:10
U盤超級加密2008 發布:2025-05-19 19:44:32 瀏覽:455
燈帶編程軟體 發布:2025-05-19 19:32:30 瀏覽:288
如何判斷伺服器被多少人訪問 發布:2025-05-19 19:27:45 瀏覽:126
編程stata 發布:2025-05-19 19:12:18 瀏覽:517