稀疏矩阵相加——三元组

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;
}
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值