15. 稀疏矩阵的乘法运算

数据压缩是提高传输、存储效率一种技术。教材第5章介绍了两种简单的压缩存储方法。

本实验要求实现两个稀疏矩阵相乘积的算法。其中稀疏矩阵非零元素数量小于100.

输入:

第1个稀疏矩阵的行数
列数
非零元个数(三个数都大于0)
三元组

第2个稀疏矩阵的行数
列数
非零元个数(三个数都大于0)
三元组

以行为主序输入稀疏矩阵三元组表

输出:
乘积矩阵的行数
列数
非零元个数(三个数都大于0)
三元组
测试用例
in:
3
4
4
1 1 3
1 4 5
2 2 -1
3 1 2
4
2
4
1 2 2
2 1 1
3 1 -2
3 2 4
out:
3↵
2↵
3↵
1,2,6↵
2,1,-1↵
3,2,4↵

#include
#include
typedef struct node1
{
	int x,y,z;
}Triple;
typedef struct node2
{
	int mu,nu,tu;
	Triple s[105];
}Matrix;
Matrix *multiply(Matrix *A,Matrix *B)
{
	Matrix *C;
	int tmp[B->nu+1],num[B->nu+1],rpot[B->nu+1];
	C=(Matrix*)malloc(sizeof(Matrix));
	if(A->nu!=B->mu)
		return NULL;
	C->mu=A->mu;
	C->nu=B->nu;
	if(A->tu*B->tu==0)
	{
		C->tu=0;
		return C;
	}
	for(int i=1;i<=B->mu;i++)
		num[i]=0;
	for(int i=0;itu;i++)
		num[B->s[i].x]++;
	rpot[1]=0;
	for(int i=2;i<=B->mu;i++)
		rpot[i]=rpot[i-1]+num[i-1];
	int r=0,p=0,k,t,q,j;
	for(int i=1;i<=A->mu;i++)
	{
		for(j=1;j<=B->nu;j++)
			tmp[j]=0;
		while(i==A->s[p].x)
		{
			k=A->s[p].y;
			if(kmu)
				t=rpot[k+1];
			else
				t=B->tu;
			for(q=rpot[k];qs[q].y;
            	tmp[j]+=A->s[p].z*B->s[q].z;
			}
			p++;
		}
		for(j=1;j<=B->nu;j++)
		{
        	if(tmp[j]!=0)
			{
            	C->s[r]={i,j,tmp[j]};
            	r++;
			}
        }
	}
	C->tu=r;
	return C;
}
int main()
{
	Matrix *A,*B,*C;
	A=(Matrix*)malloc(sizeof(Matrix));
    B=(Matrix*)malloc(sizeof(Matrix));
    scanf("%d %d %d",&A->mu,&A->nu,&A->tu);
    for(int i=0;itu;i++)
        scanf("%d %d %d",&A->s[i].x,&A->s[i].y,&A->s[i].z);
	scanf("%d %d %d",&B->mu,&B->nu,&B->tu);
	for(int i=0;itu;i++)
        scanf("%d %d %d",&B->s[i].x,&B->s[i].y,&B->s[i].z);
    C=multiply(A,B);
    printf("%d\n%d\n%d\n",C->mu,C->nu,C->tu);
    for(int i=0;itu;i++)
        printf("%d,%d,%d\n",C->s[i].x,C->s[i].y,C->s[i].z);
}

你可能感兴趣的:(15. 稀疏矩阵的乘法运算)