對於那些零元素數目遠遠多於非零元素數目,並且非零元素的分布沒有規律的矩陣稱為稀疏矩陣(sparse)。
人們無法給出稀疏矩陣的確切定義,一般都只是憑個人的直覺來理解這個概念,即矩陣中非零元素的個數遠遠小於矩陣元素的總數,並且非零元素沒有分布規律。
由於稀疏矩陣中非零元素較少,零元素較多,因此可以採用只儲存非零元素的方法來進行壓縮儲存。
由於非零元素分布沒有任何規律,所以在進行壓縮儲存的時侯需要儲存非零元素值的同時還要儲存非零元素在矩陣中的位置,即非零元素所在的行號和列號,也就是在儲存某個元素比如aij的值的同時,還需要儲存該元素所在的行號i和它的列號j,這樣就構成了乙個三元組(i,j,aij)的線性表。
三元組可以採用順序表示方法,也可以採用鏈式表示方法,這樣就產生了對稀疏矩陣的不同壓縮儲存方式。
若把稀疏矩陣的三元組線性表按順序儲存結構儲存,則稱為稀疏矩陣的三元組順序表。
順序表中除了儲存三元組外,還應該儲存矩陣行數、列數和總的非零元素數目,這樣才能唯一的確定乙個矩陣。
順序儲存結構儲存三元組線性表的c#**如下:
struct tupletype
}class spmatrix
十字鍊錶結點分為三類 :
表結點,它由五個域組成,其中i和j儲存的是結點所在的行和列,right和down儲存的是指向十字鍊錶中該結點所有行和列的下乙個結點的指標,v用於存放元素值。
行頭和列頭結點,這類結點也有域組成,其中行和列的值均為零,沒有實際意義,right和down的域用於在行方向和列方向上指向表結點,next用於指向下乙個行或列的表頭結點。
總表頭結點,這類結點與表頭結點的結構和形式一樣,只是它的i和j存放的是矩陣的行和列數。
十字鍊錶可以看作是由各個行煉表和列鍊錶共同搭建起來的乙個綜合鍊錶,每個結點aij既是處在第i行鍊錶的乙個結點,同時也是處在第j列煉表上的乙個結點,就你是處在十字交叉路口上的乙個結點一樣,這就是十字鍊錶的由來。
十字鍊錶中的每一行和每一列鍊錶都是乙個迴圈鍊錶,都有乙個表頭結點。
矩陣運算通常包括矩陣轉置、矩陣加、矩陣乘、矩陣求逆等。這裡僅討論最簡單的矩陣轉置運算演算法。
矩陣轉置運算是矩陣運算中最重要的一項,它是將m×n的矩陣變成另外乙個n×m的矩陣,使原來矩陣中元素的行和列的位置互換而值保持不變,即若矩陣n是矩陣m的轉置矩陣,則有:m[i][j]=n[j][i] (0≤i≤m-1,0≤j≤n-1)。
三元組表表示轉置矩陣的具體方法是:
第一步:根據m矩陣的行數、列數和非零元總數確定n矩陣的列數、行數和非零元總數。
第二步:當三元組表非空(m矩陣的非零元不為0)時,對m中的每一列col(0≤col≤n-1),通過從頭至尾掃瞄三元組表data,找出所有列號等於col的那些三元組,將它們的行號和列號互換後依次放人n的data中,即可得到n的按行優先的壓縮存貯表示。
class spmatrix
set}
public int nd
set}
public int td
set}
//三元組表的data屬性
public tupletype data
set}
//初始化三元組順序表
public spmatrix()
public spmatrix(int maxnum, int md, int nd)
//設定三元組表元素的值
public void setdata(int i, int j, t v)
//矩陣轉置演算法
資料結構 稀疏矩陣
稀疏矩陣 矩陣中有效資料的個數遠遠小於無效資料的個數,則可以稱之為稀疏矩陣 如果還像以前那樣將每個稀疏矩陣的資料都儲存起來,則會造成記憶體的很大程度的浪費,所以應用特別的儲存方式。稀疏矩陣的壓縮儲存 使用 三元組儲存每乙個有效資料,三元組按原矩陣中的位置,以行優先順序先後順序依次存放。矩陣的轉置 將...
資料結構 稀疏矩陣
簡單的說,設矩陣amn中有s個非零元素,若s遠遠小於矩陣元素的總數,則稱a為稀疏矩陣。s與m x n的比稱為矩陣的稀疏因子。當用陣列儲存稀疏矩陣中的元素時,僅有少部分的空間被利用,造成空間的浪費,為了節省儲存空間,可以採用一種壓縮的儲存方法來表示稀疏矩陣。由於非零元素的分布一般是沒有規律的,因此在儲...
資料結構 稀疏矩陣
稀疏矩陣時矩陣中的一種特殊情況,其非零元素的個數遠遠小於零元素個數。1.順序儲存 非零元素三元組的結構定義 struct triple 其中row代表行號,col代表列號,val用來儲存元素值 稀疏矩陣的順序儲存型別定義 struct smatrix m,n,t域分別用來儲存稀疏矩陣的行數,列數,非...