稀疏矩阵的乘法

#include<iostream>
using namespace std;
struct triple{
	int r;//hang
	int c;//lie
	int data;
};
struct matrix{
	triple ko[300];
	int rpos[15];//各行第一个非0原在ko中的位置
	int num[15];//各行非0元的个数
	int mu;//矩阵的行数
	int nu;//矩阵的列数
	int tu;//矩阵的非零元数
};
void mul(matrix x,matrix y,matrix &z)
{
	z.mu=x.mu;
	z.nu=y.nu;
	z.tu=0;
	int i,j,ca,p,q;
	for(i=1;i<=x.mu;i++)
	{
		int ctemp[20];
		for(j=1;j<=y.nu;j++)
			ctemp[j]=0;
		int xn;
		if(i==x.mu)
			xn=x.tu+1;
		else xn=x.rpos[i+1];
		for(j=x.rpos[i];j<xn;j++)
		{
			ca=x.ko[j].c;
			int yn;
			if(ca==y.mu)
				yn=y.tu+1;
			else yn=y.rpos[ca+1];
			for(p=ca;p<yn;p++)
				ctemp[y.ko[p].c]+=(x.ko[j].data*y.ko[p].data);
		}
		for(q=1;q<=y.nu;q++)
		{
			if(ctemp[q]!=0)
			{
				z.tu=z.tu+1;
				z.ko[z.tu].r=i;
				z.ko[z.tu].c=q;
				z.ko[z.tu].data=ctemp[q];
			}
		}
	}
}
int main()
{
	while(1)
	{
		matrix A,B,C;
		int i,j,r;
		cout<<"输入矩阵A的信息"<<endl;
		cin>>A.mu>>A.nu>>A.tu;
		for(i=0;i<=A.mu;i++)
		{
			A.num[i]=0;
			A.rpos[i]=0;
		}
		for(i=1;i<=A.tu;i++)
		{
			cin>>A.ko[i].r>>A.ko[i].c>>A.ko[i].data;
		    A.num[A.ko[i].r]+=1;
		}
		A.rpos[1]=1;
		for(i=2;i<=A.mu;i++)
			A.rpos[i]=A.rpos[i-1]+A.num[i-1];
		cout<<"输入矩阵B的信息"<<endl;
		cin>>B.mu>>B.nu>>B.tu;
		for(i=0;i<=B.mu;i++)
		{
			B.num[i]=0;
			B.rpos[i]=0;
		}
		for(i=1;i<=B.tu;i++)
		{
			cin>>B.ko[i].r>>B.ko[i].c>>B.ko[i].data;
		    B.num[B.ko[i].r]+=1;
		}
		B.rpos[1]=1;
		for(i=2;i<=B.mu;i++)
			B.rpos[i]=B.rpos[i-1]+B.num[i-1];
		mul(A,B,C);
		cout<<"输出C的所有元素"<<endl;
		for(i=1;i<=C.tu;i++)
			cout<<C.ko[i].r<<" "<<C.ko[i].c<<" "<<C.ko[i].data<<endl;
		cout<<endl;
	}
	return 0;
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值