1. 程式人生 > >稀疏矩陣三元組的相加相乘運算

稀疏矩陣三元組的相加相乘運算

程式碼如下:

//矩陣三元組之矩陣相加 相乘
#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;
}