各種特殊矩陣的壓縮儲存

2021-06-29 10:56:13 字數 4137 閱讀 2850

**:just steps

為了節省儲存空間並且加快處理速度,需要對這類矩陣進行壓縮儲存,壓縮儲存的原則是:不重複儲存相同元素;不儲存零值元素。

一、相關概念

㈠特殊矩陣:矩陣中存在大多數值相同的元,或非0元,且在矩陣中的分布有一定規律。

⒈對稱矩陣:矩陣中的元素滿足

aij=aji    1≤i,j≤n
⒉三角矩陣:上(下)三角矩陣指矩陣的下(上)三角(不包括對角線)中的元素均為常數c或0的n階矩陣。

⒊對角矩陣(帶狀矩陣):矩陣中所有非0元素集中在主對角線為中心的區域中。

㈡稀疏矩陣:非0元素很少(≤ 5%)且分布無規律。

二、儲存結構及演算法思想

1、對稱矩陣

儲存分配策略: 每一對對稱元只分配乙個儲存單元,即只儲存下三角(包括對角線)的元, 所需空間數為: n(n+1)/2。

儲存分配方法: 用一維陣列sa[n(n+1)/2]作為儲存結構。

2、三角矩陣

也是乙個n階方陣,有上三角和下三角矩陣。下(上)三角矩陣是主對角線以上(下)元素均為零的n階矩陣。設以一維陣列sb[0..n(n+1)/2]作為n階三角矩陣b的儲存結構,仍採用按行儲存方案,則b中任一元素bi,j和sb[k]之間仍然有如上的對應關係,只是還需要再加乙個儲存常數c的儲存空間即可。如在下三角矩陣中,用n(n+1)/2的位置來儲存常數。

35、矩陣(稀疏矩陣)的壓縮儲存(一) - 墨涵 - 墨涵天地

對特殊矩陣的壓縮儲存實質上就是將二維矩陣中的部分元素按照某種方案排列到一維陣列中,不同的排列方案也就對應不同的儲存方案

2、稀疏矩陣

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

1)、三元組表示法

三元組表示法就是在儲存非零元的同時,儲存該元素所對應的行下標和列下標。稀疏矩陣中的每乙個非零元素由乙個三元組(i,j,aij)唯一確定。矩陣中所有非零元素存放在由三元組組成的陣列中。

在此,data域中表示非零元的三元組是以行序為主序順序排列的。

以下看如何利用三元組表示法來實現矩陣的轉置。

(1)按照b.data中三元組的次序依次在a.data中找出相應的三元組進行轉置。換句話說,按照矩陣m的列序進行轉置。為了找到m的每一列中所有的非零元素,需要對其三元組表a.data從第一行起整個掃瞄一遍。由於a.data是以m的行序為存放每個非零元的,由此得到的恰好是b.data應有的順序。

2)、帶輔助行向量的二元組表示法及十字鍊錶表示法在下一節中學習介紹。

三、儲存結構及c語言描述

1、三元組表示法

(1)按照b矩陣中的行次序依次在a.data中找到相應的三元組進行轉置。

(2)快速轉置:按照a.data中三元組的次序進行轉置,並將轉置後的三元組放到b.data中的恰當位置。

恰當位置的確定:首先計算m矩陣的每一列(即t的每一行)中非0元的個數,然後求得m矩陣每一列第乙個非0元在b.data中的位置。

演算法基本思想:

設定兩個向量:

num[col]:第col列的非零元素個數。

cpot[col]:第col列第乙個非零元在b.data中的恰當位置。

在轉置過程中,指示該列下乙個非零元在b.data中的位置。

1、num[col]的計算:

順序掃瞄a.data三元組,累計各列非0元個數。

2、cpot[col]計算:

2)、帶輔助行向量的二元組表示法及十字鍊錶表示法在下一節中學習介紹。

四、演算法的c語言實現

typedef int elemtype;

typedef struct

int i,j;

elemtype e;

}triple;

typedef struct

triple data[maxsize+1];

int mu,nu,tu; //矩陣行數,列數和非0元個數

}tsmatrix;

int cpot[maxsize+1],num[maxsize+1];

int transposesmatrix(tsmatrix m,tsmatrix &t)

t.mu=m.nu;

t.nu=m.mu;

t.tu=m.tu;

if(t.tu)

int q=1;

for(int col=1;col<=m.nu;++col)

for(int p=1;p<=m.tu;++p)

if(m.data[p].j==col)

//if

}//if

return ok;

}//transposesmatrix

int inputm(tsmatrix &m)

printf(「input nu mu tu(with a space interval)of a matrix:\n」);

scanf(「%d %d %d」,&m.nu,&m.mu,&m.tu); //row,colume,and tu

printf(「please input the data of matrix:\n」);

for(int c=1;c<=m.tu;c++)

scanf("%d",&m.data[c].i);

scanf("%d",&m.data[c].j);

scanf("%d",&m.data[c].e);

}//for

return 1;

}//input

int printm(tsmatrix t)

printf(「matrix after transpose is:\n」);

for(int c=1;c<=t.tu;c++)

printf("%d %d %d\n",t.data[c].i,t.data[c].j,t.data[c].e);
}//for

return 1;

}//input

int fasttransposesmatrix(tsmatrix m,tsmatrix &t)

t.mu=m.nu;

t.nu=m.mu;

t.tu=m.tu;

if(t.tu)

for(int col=1;col<=m.mu;++col) num[col]=0;

for(int t=1;t<=m.tu;++t) ++num[m.data[t].j]; //記述m.data[t].j列

//非0元的個數
cpot[1]=1;

//求第col列中第乙個非零元在b.data(t)中的序號

for(int col=2;col<=m.mu;++col)

cpot[col]=cpot[col-1]+num[col-1];
for(int p=1;p<=m.tu;++p)

//for
}//if

return ok;

}//fasttransposesmatrix

int main()

tsmatrix m,t;

inputm(m);

//transposesmatrix(m,t);

fasttransposesmatrix(m,t);

printm(t);

return ok;

特殊矩陣的壓縮儲存

特殊矩陣的主要形式有 1 對稱矩陣 2 上三角矩陣 下三角矩陣 3 對角矩陣 它們都是方陣,即行數和列數相同。一 對稱矩陣的壓縮儲存 若乙個n階方陣a n n 中的元素滿足a i,j a j,i 0 i,j n 1 則稱其為n階對稱矩陣。由於對稱矩陣中的元素關於主對角線對稱,因此在儲存時可只儲存對稱...

特殊矩陣的壓縮儲存

壓縮儲存 指多個值相同的元素只分配乙個儲存空間,對零元素不分配儲存空間。特殊矩陣 指具有許多相同矩陣元素或零元素,並且這些相同矩陣元素或零元素的分布有一定規律性的矩陣。特殊矩陣的壓縮儲存 找出特殊矩陣中值相同的矩陣元素的分布規律,把那些呈現規律性分布 值相同的多個矩陣元素壓縮儲存到乙個儲存空間上。若...

陣列的壓縮儲存(特殊矩陣 稀疏矩陣)

其實這裡就不應該說是陣列了,而應該是說行列式,對稱矩陣 a i j a j i 上下三角行列式 對角線以下 以上的元素均為0 帶狀行列式 這個可能不太好理解,舉乙個例子 1 1 0 0 0 1 1 1 0 0 0 1 1 1 0 0 0 1 1 1 0 0 0 1 1 這時看對角線比較舒服,可以看出...