當前位置:首頁 » 服務存儲 » 稀疏矩陣壓縮存儲後必會失去隨機存取功能
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

稀疏矩陣壓縮存儲後必會失去隨機存取功能

發布時間: 2022-07-05 08:17:16

『壹』 如何在工作空間查看稀疏矩陣

稀疏矩陣

設矩陣Amn中有s個非零元素,若s遠遠小於矩陣元素的總數(即s<<m×n),則稱A為稀疏矩陣。

1、稀疏矩陣的壓縮存儲
為了節省存儲單元,可只存儲非零元素。由於非零元素的分布一般是沒有規律的,因此在存儲非零元素的同時,還必須存儲非零元素所在的行號、列號,才能迅速確定一個非零元素是矩陣中的哪一個元素。稀疏矩陣的壓縮存儲會失去隨機存取功能。
其中每一個非零元素所在的行號、列號和值組成一個三元組(i,j,aij),並由此三元組惟一確定。
稀疏矩陣進行壓縮存儲通常有兩類方法:順序存儲和鏈式存儲。鏈式存儲方法【參見參考書目】。

2、三元組表
將表示稀疏矩陣的非零元素的三元組按行優先(或列優先)的順序排列(跳過零元素),並依次存放在向量中,這種稀疏矩陣的順序存儲結構稱為三元組表。
注意:
以下的討論中,均假定三元組是按行優先順序排列的。
【例】下圖(a)所示的稀疏矩陣A的三元組表表示見圖(b)

(1)三元組表的類型說明
為了運算方便,將矩陣的總行數、總列數及非零元素的總數均作為三元組表的屬性進行描述。其類型描述為:
#define MaxSize 10000 //由用戶定義
typedef int DataType; //由用戶定義
typedef struct { //三元組
int i,j;//非零元的行、列號
DataType v; //非零元的值
}TriTupleNode;

typedef struct{ //三元組表
TriTupleNode data[MaxSize]; //三元組表空間
int m,n,t; //矩陣的行數、列數及非零元個數
}TriTupleTable;

(2) 壓縮存儲結構上矩陣的轉置運算
一個m×n的矩陣A,它的轉置矩陣B是一個n×m的矩陣,且:
A[i][j]=B[j][i],0≤i<m,0≤j<n,
即A的行是B的列,A的列是B的行。
【例】下圖中的B和上圖中的A互為轉置矩陣。


①三元組表表示的矩陣轉置的思想方法
第一步:根據A矩陣的行數、列數和非零元總數確定B矩陣的列數、行數和非零元總數。
第二步:當三元組表非空(A矩陣的非零元不為0)時,根據A矩陣三元組表的結點空間data(以下簡稱為三元組表),將A的三元組表a->data置換為B的三元組表b->data。

②三元組表的轉置
方法一:簡單地交換a->data中i和j中的內容,得到按列優先順序存儲倒b->data;再將b->data重排成按行優先順序的三元組表。
方法二:由於A的列是B的行,因此,按a->data的列序轉置,所得到的轉置矩陣B的三元組表b->data必定是按行優先存放的。
按這種方法設計的演算法,其基本思想是:對A中的每一列col(0≤col≤a->n-1),通過從頭至尾掃描三元組表a->data,找出所有列號等於col的那些三元組,將它們的行號和列號互換後依次放人b->data中,即可得到B的按行優先的壓縮存貯表示。具體實現參見【動畫演示】

③具體演算法:
void TransMatrix(TriTupleTable *b,TriTupleTable *a)
{//*a,*b是矩陣A、B的三元組表表示,求A轉置為B
int p,q,col;
b->m=a->n; b->n=a->m; //A和B的行列總數互換
b->t=a->t; //非零元總數
if(b->t<=0)
Error("A=0"); //A中無非零元,退出
q=0;
for(col=0;col<a->n;col++) //對A的每一列
for(p=0;p<a->t;p++) //掃描A的三元組表
if(a->data[p].j==col){ //找列號為col的三元組
b->data[q).i=a->data[p].j;
b->data[q].j=a->data[p].i;
b->data[q].v=a->data[p].v;
q++;
}
} //TransMatrix

④演算法分析
該演算法的時間主要耗費在col和p的二重循環上:
若A的列數為n,非零元素個數t,則執行時間為O(n×t),即與A的列數和非零元素個數的乘積成正比。
通常用二維數組表示矩陣時,其轉置演算法的執行時間是O(m×n),它正比於行數和列數的乘積。
由於非零元素個數一般遠遠大於行數,因此上述稀疏矩陣轉置演算法的時間大於通常的轉置演算法的時間。

上一頁

3、帶行表的三元組表
為了方便某些矩陣運算,在按行優先存儲的三元組表中,加入一個行表來記錄稀疏矩陣中每行的非零元素在三元組表中的起始位置。這就是帶行表的三元組表。
(1)類型描述
#define MaxRow l00 //在三元組表定義前加入此最大行定義
typedef struct {
TriTupleNode data[MaxSize];
int RowTab[MaxRow];//行表,應保證m≤MaxRow
int m,n,t;
}RTriTupleTable;

(2)帶行表的三元組表的操作
① 對於任給行號i(0≤i≤m-1),能迅速地確定該行的第一個非零元在三元組表中的存儲位置為RowTab[i]
② RowTab[i](0≤i≤m-1)表示第i行之前的所有行的非零元數。
③ 第i行上的非零元數目為RowTab[i+1]-RowTab[i](0≤i≤m-2)
④ 最後一行(即第m-l行)的非零元數目為t-RowTab[m-1](t為矩陣的非零元總數)
注意:
若在行表中令RowTab[m]=t(要求MaxRow>m)會更方便 些,且t可省略。
帶行表的三元組表可改進矩陣的轉置演算法,具體【參閱其它參考書】。

4.稀疏矩陣壓縮存儲方式分析
(1) 三元組表和帶行表的三元組表的特點
相應的演算法描述較為簡單,但這類順序存儲方式對於非零元的位置或個數經常發生變化的矩陣運算就顯得不太適合。
【例】執行將矩陣B相加到矩陣A上的運算時,某位置上的結果可能會由非零元變為零元,但也可能由零元變為非零元,這就會引起在A的三元組表中進行刪除和插人操作,從而導致大量結點的移動。對此類運算採用鏈式存儲結構為宜。

(2)稀疏矩陣的鏈式結構
稀疏矩陣的鏈式結構有十字鏈表等方法,適用於非零元變化大的場合,比較復雜,可【參閱其它參考書】。

『貳』 稀疏矩陣的壓縮存儲思想

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

『叄』 特殊矩陣和稀疏矩陣哪種壓縮存儲後會失去隨機存取的功能為什麼

疏矩陣壓縮存儲後,必會失去隨機存取功能。 稀疏矩陣在採用壓縮存儲後將會失去隨機存儲的功能。因為在這種矩陣中,非零元素的分布是沒有規律的,為了壓縮存儲,就將每一個非零元素的值和它所在的行、列號做為一個結點存放在一起,這樣的結點組成的線性表中叫三元組表,它已不是簡單的向量,所以無法用下標直接存取矩陣中的元素。

『肆』 數據結構稀疏矩陣問題求幫忙謝謝謝謝

不是說不能讀取,而是說不能隨機讀取,意思就是不能一次就都到所需要的數據,而是要通過搜索,一個一個比較,運氣好的話,第一次就能得到需要的數據,運氣不好的話,就要把所有的數據全部讀完以後才找到或是確定找不到。

『伍』 麻煩會數據結構的朋友幫忙解決點判斷題

1,錯,2,對,3,對,4,對,5,錯,6,對,7,錯,8,對,9,對,10,錯

『陸』 十字鏈表不是順序存儲結構數組可以看成線性結構的推廣嗎稀疏矩陣壓縮存儲會失去隨機存取的功能嗎

鏈表當然不是順序存儲結構,數組是線性結構的的推廣!

『柒』 數據結構

分都沒有 沒人回答

『捌』 對稀疏矩陣進行壓縮存儲的目的是什麼

對稀疏矩陣進行壓縮存儲目的是節省存儲空間。

存儲矩陣的一般方法是採用二維數組,其優點是可以隨機地訪問每一個元素,因而能夠較容易地實現矩陣的各種運算。

但對於稀疏矩陣而言,若用二維數組來表示,會重復存儲了很多個0了,浪費空間,而且要花費時間來進行零元素的無效計算。所以必須考慮對稀疏矩陣進行壓縮存儲。



(8)稀疏矩陣壓縮存儲後必會失去隨機存取功能擴展閱讀

優點

稀疏矩陣的計算速度更快,因為MATLAB只對非零元素進行操作,這是稀疏矩陣的一個突出的優點。假設矩陣A,B中的矩陣一樣,計算2*A需要一百萬次的浮點運算,而計算2*B只需要2000次浮點運算。

因為MATLAB不能自動創建稀疏矩陣,所以要用特殊的命令來得到稀疏矩陣。算術和邏輯運算都適用於稀疏矩陣。對於一個用二維數組存儲的稀疏矩陣Amn,如果假設存儲每個數組元素需要L個位元組,那麼存儲整個矩陣需要m*n*L個位元組。

『玖』 特殊矩陣和稀疏矩陣哪一種壓縮存儲後失去隨機存取的功能為什麼

稀疏矩陣壓縮存儲後,必會失去隨機存取功能。稀疏矩陣在採用壓縮存儲後將會失去隨機存儲的功能。因為在壓縮存儲當中,非零元素的分布是沒有規律的,為了壓縮存儲,就將每一個非零元素的值和它所在的行、列號做為一個結點存放在一起,即三元組表,它不是簡單的向量,所以無法用下標直接存取矩陣中的元素。

『拾』 特殊矩陣和稀疏矩陣哪一種採用壓縮存儲會失去隨機存取的功能為什麼

稀疏矩陣壓縮存儲後,必會失去隨機存取功能。
稀疏矩陣在採用壓縮存儲後將會失去隨機存儲的功能。因為在這種矩陣中,非零元素的分布是沒有規律的,為了壓縮存儲,就將每一個非零元素的值和它所在的行、列號做為一個結點存放在一起,這樣的結點組成的線性表中叫三元組表,它已不是簡單的向量,所以無法用下標直接存取矩陣中的元素。