1. 稀疏矩阵
一个阶数较大的矩阵中的非零元素个数s相对于矩阵元素的总个数 t 很小时,即s<ts<t,称该矩阵为稀疏矩阵。
比如:在一个100×100的矩阵中,其中只有100个非零元素,而非零元素相对于矩阵中的元素总个数10000很小,那么该矩阵为稀疏矩阵。
2. 稀疏矩阵的压缩存储方法
对于稀疏矩阵来说,如果我们还是用100×100的方式来存储的话,显然是非常浪费的,因此我们可以采用一种稀疏矩阵的压缩存储方式,即三元组方式。
三元组方式存储数据的策略是只存储非零元素。但是稀疏矩阵中非零元素的分布是没有任何规律的,在这种情况下,存储方案是:
1.存储非零元素
2.同时存储该非零元素所对应的行下标和列下标
3.稀疏矩阵中的每一个非零元素需由一个三元组(i, j, aijaij)唯一确定,稀疏矩阵中的所有非零元素构成三元组线性表,三元组中的i就是行下标,j是列下标,aijaij是对应的元素值。
typedef struct{
int i;
int j;
datatype v;
}node;
typedef struct
{
int t; //非零元素个数
int m; //行数
int n; //列数
node data [MAX];
}spmatrix;
稀疏矩阵相加——三元组
spmatrix * add(spmatrix *a,spmatrix *b)
{
spmatrix *c;
int cno,ano,bno;//记录三个数据结构中的数值分别计算到哪了
if(a->m!=b->m || a->n!=b->n)
return NULL;
c=(spmatrix *)malloc(sizeof(spmatrix));
c->m=a->m;
c->n=a->n;
cno=bno=ano=0;
while(ano<a->t&&bno<b->t)
{
if(a->data[ano].i = b->data[bno].i&&a->data[ano].j = b->data[bno].j)
{
//相加非零再进行操作
if(a->data[ano].v+b->data[bno].v)
{
c->data[cno].i=a->data[ano].i;
c->data[cno].j=a->data[ano].j;
c->data[cno].v=a->data[ano].v+b->data[bno].v;
cno++;
}
ano++;
bno++;
}
else if(a->data[ano].i < b->data[bno].i || (a->data[ano].i==b->data[bno].i&&a->data[ano].j<b->data[bno].j) )
{
c->data[cno].i=a->data[ano].i;
c->data[cno].j=a->data[ano].j;
c->data[cno].v=a->data[ano].v;
cno++;
ano++;
}
else if(b->data[bno].i < a->data[ano].i || (b->data[bno].i==a->data[ano].i&&b->data[bno].j<a->data[ano].j) )
{
c->data[cno].i=b->data[bno].i;
c->data[cno].j=b->data[bno].j;
c->data[cno].v=b->data[bno].v;
cno++;
bno++;
}
}
while(ano<a->t)
{
c->data[cno].i=a->data[ano].i;
c->data[cno].j=a->data[ano].j;
c->data[cno].v=a->data[ano].v;
cno++;
ano++;
}
while(bno<a->t)
{
c->data[cno].i=b->data[bno].i;
c->data[cno].j=b->data[bno].j;
c->data[cno].v=b->data[bno].v;
cno++;
bno++;
}
c->t=cno;
return c;
}