稀疏矩阵三元组的相加相乘运算

代码如下:

//矩阵三元组之矩阵相加 相乘
#include <iostream>
using namespace std;
typedef int Elemtype;
#define  MAXSIZE  12500  //最大非零元素
typedef struct Triple
{
	Elemtype value;
	int row,col;
}Triple;

typedef struct TSMatrix
{
	Triple data[MAXSIZE+1];
	int mu,nu,tu;
}TSMatrix;
TSMatrix T;
void InputMatrix(TSMatrix &T)  //输入t个非零元素
{
	cout<<"请输入稀疏矩阵的信息,(行,列,非零元素个数)"<<endl;
	cin>>T.mu>>T.nu>>T.tu;
	int i;
	cout<<"请输入非零元素的信息(行,列,值),提醒(下标从1开始)"<<endl;
	for(i=1;i<=T.tu;++i)
	{
		cin>>T.data[i].row>>T.data[i].col>>T.data[i].value;
	}
}

void Output(TSMatrix T)
{
	cout<<"矩阵的三元组表示(ROW=)"<<T.mu<<" COL="<<T.nu<<"非零个数="<<T.tu<<endl;
	int i;
	for(i=1;i<=T.tu;++i)
	{
		cout<<"ROW(行):"<<T.data[i].row<<" COL(列):"<<T.data[i].col<<" Value(值)"<<T.data[i].value<<endl;
	}
}

void TransposeSMatrix(TSMatrix M,TSMatrix &T)  //矩阵的转置
{
	T.mu=M.nu;T.nu=M.mu;T.tu=M.tu;
	int i,j,k=1;
	for(i=1;i<=M.nu;++i)
	{
		for(j=1;j<=M.tu;++j)
		if(M.data[j].col==i)
		{
			T.data[k].row=i;
			T.data[k].col=M.data[j].row;
			T.data[k].value=M.data[j].value;
			++k;
		}
	}
}

void AddMastrix(TSMatrix M,TSMatrix T,TSMatrix &Q)  //矩阵相加
{
	int index_a,index_b,i=1,j=1,k=1;
	Q.mu=M.mu; Q.nu=M.nu;
	while (i<=M.tu&&j<=T.tu)
	{
		index_a=(M.data[i].row)*(M.data[i].col)+M.data[i].col;
		index_b=(T.data[j].row)*(T.data[j].col)+T.data[j].col;
		if(index_a<index_b)
		{
			Q.data[k]=M.data[i];
			i++;
			k++;
		}
		else if(index_a>index_b)
		{
			Q.data[k]=T.data[j];
			j++;
			k++;
		}
		else if(index_a==index_b)
		{
			if((M.data[i].value+T.data[j].value)!=0)
			{
				Q.data[k]=M.data[i];
				Q.data[k].value=M.data[i].value+T.data[j].value;
				k++;
			}
			++i;
			++j;
		}
	}
	//复制剩余元素
	for(;i<=M.tu;++i)
	{
		Q.data[k]=M.data[i];
		k++;
	}
	for(;j<=T.tu;++j)
	Q.data[k++]=T.data[j];
	Q.tu=k-1;
}

void Multiply(TSMatrix M,TSMatrix T,TSMatrix &Q)
{
	if(M.nu!=T.mu)
	{
		cerr<<"两矩阵相乘不合法"<<endl;
		return ;
	}
	int *rowSize=new int[T.mu+1]; //存放每行非零元素的个数
	int *rowStart=new int[T.mu+2]; //矩阵每行在三元组开始位置
	int *temp=new int[T.nu+1];       //存放结果矩阵中每行的计算结果
	int i,Current,k,ROWM,COLM,COLB;
	for(i=1;i<=T.mu;i++) rowSize[i]=0;
	for(i=1;i<=T.tu;++i) rowSize[T.data[i].row]++;
	rowStart[1]=1;
	for(i=2;i<=T.mu+1;i++)
	rowStart[i]=rowStart[i-1]+rowSize[i-1];
	Current=1; k=1;
	while (Current<=M.tu)
	{
		ROWM=M.data[Current].row;        //当前三元组数据中元素的行号
		for(i=1;i<=T.nu;++i) temp[i]=0;
		while (Current<=M.tu&&ROWM==M.data[Current].row)
		{
			COLM=M.data[Current].col;        //当前元素的列号,方便与T矩阵的行号相乘
			for(i=rowStart[COLM];i<rowStart[COLM+1];i++)  //对应T矩阵中每行的个数
			{
				COLB=T.data[i].col;
				temp[COLB]+=(M.data[Current].value)*(T.data[i].value);
			}
			Current++;
		}
	for(i=1;i<=T.nu;i++)
	{
		if(temp[i]!=0)
		{
			Q.data[k].row=ROWM;
			Q.data[k].col=i;
			Q.data[k].value=temp[i];
		k++;
                  }
	}
  }
	Q.mu=M.mu;Q.nu=T.nu;
	Q.tu=k-1;
}
int main()
{
	TSMatrix T,M,Q,S;
	InputMatrix(M);
	InputMatrix(T);
	cout<<"两矩阵相乘"<<endl;
	Multiply(M,T,Q);
	Output(Q);
	cout<<"两矩阵相加"<<endl;
	AddMastrix(M,M,S);
	Output(S);
	system("pause");
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值