Dreamer Thinker Doer

Make a difference !

数组与广义表_稀疏矩阵的压缩存储_三元组做存储结构_矩阵相乘

"head.h"



#include<iostream>
using namespace std;

#define MAX_MATRIXSIZE 20
#define ElemType int

class Triple//三元组类
{
public:
	int i,j;//行列号
	ElemType e;//元素值
};

class TSMatrix//矩阵类
{
public:
	Triple matrix[MAX_MATRIXSIZE];//三元组集合 
	int mu,nu,tu;//行数,列数,非零元个数
};

class Matrix//矩阵类封装了有关矩阵的操作
{
public:
	void MatrixMutiply();//接口函数
private:
	void GetMatrix();//得到矩阵的三元组
	void Mutiply();//矩阵相乘
	void PrintMatrix(TSMatrix&);//打印矩阵
	void GetCpot(int[],TSMatrix &);//求得辅助数组Cpot的值//Cpot[i]代表行号为i的第一个元素在三元组中的位置
	TSMatrix m,n,q;//实例化矩阵类的对象
};

void Matrix::MatrixMutiply()//接口函数
{
	GetMatrix();
	Mutiply();
	PrintMatrix(m);
	PrintMatrix(n);
	PrintMatrix(q);
}

void Matrix::GetMatrix()//得到矩阵M,N的三元组
{
	char name[2]={'M','N'};
	TSMatrix * M[2]={&m,&n};
	for(int c=0;c<2;c++)
	{
		cout<<"Please Input The Size Of The Matrix "<<name[c]<<"(m*n)"<<endl;
		cin>>M[c]->mu>>M[c]->nu;
		M[c]->tu=1;
		cout<<"Please Input Matrix With Increasing Order Of RowNumber"<<endl
			<<"rownum columnnum element"<<endl<<endl;
		int i,j;
		ElemType e;
		while(cin>>i>>j>>e)
		{
			M[c]->matrix[M[c]->tu].i=i;
			M[c]->matrix[M[c]->tu].j=j;
			M[c]->matrix[M[c]->tu].e=e;
			M[c]->tu++;
		}
		cin.clear();
	}
}

void Matrix::GetCpot(int Cpot[],TSMatrix &t)//求得辅助数组Cpot的值//Cpot[i]代表行号为i的第一个元素在三元组中的位置
{
	int num[MAX_MATRIXSIZE];
	memset(num,0,sizeof(num));
	for(int i=1;i<t.tu;i++)
		num[t.matrix[i].i]++;
	Cpot[1]=1;
	for(int i=2;i<=t.mu+1;i++)
		Cpot[i]=Cpot[i-1]+num[i-1];
}

void Matrix::Mutiply()
{
	int cpotm[MAX_MATRIXSIZE],cpotn[MAX_MATRIXSIZE];
	GetCpot(cpotm,m);
	GetCpot(cpotn,n);
	int temp[MAX_MATRIXSIZE];
	q.tu=1;
	for(int i=1;i<m.tu;i=cpotm[m.matrix[i].i+1])
	{
		memset(temp,0,sizeof(temp));		
		for(int j=i;j<cpotm[m.matrix[i].i+1];j++)
		{
			for(int k=cpotn[m.matrix[j].j];k<cpotn[m.matrix[j].j+1];k++)
				temp[n.matrix[k].j]+=m.matrix[j].e*n.matrix[k].e;
		}
		for(int j=1;j<=n.nu;j++)
		{
			if(temp[j]!=0)
			{
				q.matrix[q.tu].i=m.matrix[i].i;
				q.matrix[q.tu].j=j;
				q.matrix[q.tu].e=temp[j];
				q.tu++;
			}
		}
	}
}

void Matrix::PrintMatrix(TSMatrix &t)//打印矩阵
{
	for(int i=1;i<t.tu;i++)
		cout<<t.matrix[i].i<<" "<<t.matrix[i].j<<" "<<t.matrix[i].e<<endl;
	cout<<endl;
}




"main.cpp"





阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭