1.稀疏矩阵的存储
三元组
非零元的值,其所在的行号,列号(value,row,col)
注:三元组中的元素一定是有序排列的,且按照行优先的形式
三元组表(sequential list of triple)
typedef struct
{
int i,j;//行号和列号
elemtype elem;//元素值
}triple;
typedef struct
{
triple data[MAXSIZE];
int mu,nu,tu;//原矩阵的行数,列数和非零元个数
}TSMatrix;
2.矩阵的转置
原矩阵:
转置后矩阵:
三元表储存形式:(转置后仍要行列有序!)
ststus transposeSMatrix(TSMatrix M,TSMatrix *T)
{
int p,q,col;
T->mu=M.nu;//T行对M列
T->nu=M.mu;//T列对M行
T->tu=M.tu;//第一个非零值
if(T->tu)//矩阵至少含有一个非零元素
{
q=0;//
for(col=0;col<M.nu;++col)//对原矩阵列遍历,保证了转置后的行有序
{
for(p=0;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].elem=M.data[p].elem;//交换元素对应的数据
++q;
}
}
}
}
缺点是时间复杂度太高
算法:快速转置(fast transpotation)
设num[ ]和cpot[ ]分别用来存放每一列的非零元素的个数和该列第一个非零元在转置后矩阵T中的位置。则有:
cpot[0]=0;
cpot[col]=cpot[col-1]+num[col-1]
每一列的非零元素可以通过对整个矩阵M扫描一遍得到。
status fasttranspose(TSMatrix M,TSMatrix *T)
{
int col,p,q,t;
T->mu=M.nu;
T->nu=M.mu;
T->tu=M.tu;//将矩阵的行列非零元等信息传给T,使其初始化
if(T->tu)
{
for(col=0;col<M.nu;++col)num[col]=0;//初始化数组
for(t=0;t<M.tu;++t)//统计每列非零元的个数
++num[M.data[t].j];
cpot[0]=0;//计算每列第一个非零元转置后的位置
for(col=1;col<M.nu;++col)
{
cpot[col]=cpot[col-1]+num[col-1];//算式
for(p=0;p<=M.tu;++p)
{
col=M.data[p].j;
q=cpot[col];
T->data[q].i=M.data[p].j;
T->data[q].j=M.data[p].i;
T->data[q].elem=M.data[p].elem;
++cpot[col];
}
}
}
q:该元素对应列出现首个非零元素在转置中对应的数组元素序号
++cpot[col]若有,对应同一列的下一个非零元素