簡單的說,設矩陣amn中有s個非零元素,若s遠遠小於矩陣元素的總數,則稱a為稀疏矩陣。s與m x n的比稱為矩陣的稀疏因子。
當用陣列儲存稀疏矩陣中的元素時,僅有少部分的空間被利用,造成空間的浪費,為了節省儲存空間,可以採用一種壓縮的儲存方法來表示稀疏矩陣。
由於非零元素的分布一般是沒有規律的,因此在儲存非零元素的同時,還必須同時記下元素所在的行和列的位置(i, j)。因此,稀疏矩陣a中的乙個非零元素可由乙個三元組唯一確定。c++中可以表示為:
template
struct triple ;
用乙個上述元素對應的一維陣列來壓縮儲存稀疏矩陣中的非零元素,便可以實現壓縮儲存。
但是,這樣的儲存方法使得一些矩陣的運算變得比較複雜,下面介紹這種儲存方式下的轉置運算:
轉置運算便是將對應的行變成列,列變成行。m * n的矩陣變換之後變成n * m的矩陣。
const
int max = 100;
template class sparsematrix
;
如果只是簡單的交換a中每個元素的col和row的內容,那麼得到的將是乙個按列為主序順序的儲存的稀疏矩陣,要得到按行為主序順序儲存的矩陣,就必須重排每個元素的順序。有兩種方法來處理:
由於a的列是b的行,因此按a.data的列序轉置,得到的轉置矩陣b的三元組表b.data必定是按行優先存放的。其演算法的基本思想是:對a中的每一列col,通過從頭到尾掃瞄掃瞄a的三元表a.data,找出所有列號等於col的那些三元組,將他們的行號和列號互換後依次放入b.data中,即可得到b的按行為主序的壓縮儲存表示。具體演算法如下:
templatevoid sparsematrix::trans1(sparsematrix& b) }}
}}
第一種方法中重複比較的次數比較多,為了節省時間,我們需要確定矩陣a中每一列第乙個非零元素在b中應儲存的位置,為了確定這個位置,在轉置之前應求得矩陣a中的每列非零元素的個數。其演算法的基本思想是:對a掃瞄一次,按a第二列提供的列號一次確定位置裝入b的三元組中。具體實施如下:一次掃瞄先確定三元組的位置關係,二次掃瞄由位置關係裝入三元組。可見,位置關係是此種演算法的關鍵。
為此需要附設兩個一維陣列num和pot,num[j]表示矩陣a中的第j列非零元素個數,pot[j]表示a矩陣中第j列第乙個非零元素在b中應存放的位置。由於a中的第0列的第乙個非零元素一定儲存在b中下標為0的位置上,該列中其他非零元素的位置應儲存在b中後續位置上。所以有下列遞推關係:
pot[0] = 0;
pot[j] = pot[j - 1] + num[j - 1]; (1
<= j <= cols - 1)
例如,矩陣a的num和pot陣列元素值如表所示:j0
1234
5num[j]22
0111
pot[j]02
4456
有了這樣乙個資料表,我們就可以順著a的三元組,將列號為col的非零元素直接存入到b的三元組中下標為pot[col]的位置上。
template void sparsematrix::trans2(sparsematrix & b)
pot[0] = 0; //a中第0列第乙個非零元素在b中的位置為0
for (j = 1; j < cols; ++j) //求a中每一列第乙個非零元素在b中的下標
pot[j] = pot[j - 1] + num[j - 1];
for (i = 0; i < terms; ++i)
}}
資料結構 稀疏矩陣
稀疏矩陣 矩陣中有效資料的個數遠遠小於無效資料的個數,則可以稱之為稀疏矩陣 如果還像以前那樣將每個稀疏矩陣的資料都儲存起來,則會造成記憶體的很大程度的浪費,所以應用特別的儲存方式。稀疏矩陣的壓縮儲存 使用 三元組儲存每乙個有效資料,三元組按原矩陣中的位置,以行優先順序先後順序依次存放。矩陣的轉置 將...
資料結構 稀疏矩陣
稀疏矩陣時矩陣中的一種特殊情況,其非零元素的個數遠遠小於零元素個數。1.順序儲存 非零元素三元組的結構定義 struct triple 其中row代表行號,col代表列號,val用來儲存元素值 稀疏矩陣的順序儲存型別定義 struct smatrix m,n,t域分別用來儲存稀疏矩陣的行數,列數,非...
資料結構 (稀疏矩陣)
使用三元組儲存乙個稀疏矩陣,函式實現稀疏矩陣的輸入,稀疏矩陣的輸出,稀疏矩陣的轉置,兩個稀疏矩陣的加法 include include include using namespace std define m 10 define n 10 typedef int datatype typedef s...