一.稀疏矩阵和其压缩存储
1.稀疏矩阵:
设m行n列的矩阵含t个非零元素,定义δ=t/(m*n)为稀疏因子,则稀疏因子小于等于0.05 的矩阵为稀疏矩阵。
2.稀疏矩阵的压缩存储:
稀疏矩阵中存在多个非零元素,且非零元素位置无规律,非零元的行下标,列下标,值以三元组( i,j,aij )形式来存储
稀疏矩阵由所有非0元的三元组所构成的线性表(三元组表)、矩阵的行数及列数唯一确定
二.稀疏矩阵的定义描述
typedef struct
{
int i,j;//该非零元的行列下标
ElemType e;
}Triple;
typedef struct
{
Triple data[MAXSIZE+1];//非零元三元组表,data[0]未用
int mu,nu,tu; //矩阵的行数,列数和非零元个数
}TSMatrix;
三.稀疏矩阵的普通转置
设M是三元组顺序表表示的稀疏矩阵,如何由M得到其转置T?
- 将矩阵的行列值相互交换
- 将每个三元组中的i和j对换
- 重排三元组的次序
对M.data从头至尾扫描
- 第一次扫描时,将M.data中列号为1的三元组赋值到T.data中
- 第二次扫描时,将M.data中列号为2的三元组赋值到T.data中
- 依此类推,直至将M.data所有三元组赋值到T.data中
Status 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)
{
T.data[q].i=M.data[p].j;
T.data[q].j=M.data[p].i;
T.data[q].e=M.data[p].e;
++q;
}
}
}
}
return OK;
}
四.稀疏矩阵的快速转置
按M中三元组次序转置,转置结果放入T中恰当位置。
转置的关键是要预先确定M中每一列第一个非零元在T中位置,并为确定这些位置,转置前应先求得M的每一列中非零元个数,所以定义两个辅助数组:
- num[col]:存储M中第col列非零元个数
- cpos[col]:存储M中第col列第一个非零元三元组在T.data中的位置
- cpos[col]的计算方法:
vcpos[1]=1
vcpos[col]=cpos[col-1]+num[col-1](2<=col <=M.nu)
Status FastTransposeSMatrix(TSMatrix M,TSMatrix &T)
{
T.mu=M.nu;
T.nu=M.mu;
T.tu=M.tu;
int num[M.nu+1];
int cpot[M.nu+1];
int col;
if(T.tu)
{
for(col=1;col<=M.nu;++col)
num[col]=0;
for(int t=1;t<=M.tu;++t)
++num[M.data[t].j];
cpot[1]=1;
for(col=2;col<=M.nu;++col)
cpot[col]=cpot[col-1]+num[col-1];
for(int p=1;p<=M.tu;++p)
{
col=M.data[p].j;
int q=cpot[col];
T.data[q].i=M.data[p].j;
T.data[q].j=M.data[p].i;
T.data[q].e=M.data[p].e;
++cpot[col];
}
}
return OK;
}