⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 稀疏矩阵运算.cpp

📁 稀疏矩阵运算
💻 CPP
字号:
// 稀疏矩阵.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <stdlib.h>
#include <stdio.h>
#include<malloc.h>
#include<iostream.h>
#define OVERFLOW -1
#define ERROR 0
#define OK 1
#define MAXSIZE 10000
#define MAXRC 100
typedef int ElemType;

typedef struct
{	
    int i;
	int j;
	ElemType e;
}Triple;

typedef struct
{
	Triple data[MAXSIZE+1];
	int rpos[MAXRC+1];
	int mu;
	int nu;
	int tu;
}RLSMatrix;
//三元组的存储结构




void CreateSMatrix(RLSMatrix &M,int m,int n)
{
//按输入的矩阵非零元建立以三元组存储的稀疏矩阵
	
	cout<<"输入矩阵的值"<<endl;
	 M.tu=0;
	int k=1;
    int p=1;
	int num[100];
	int i,j;
	ElemType e;
	M.mu=m;				//传递矩阵的行列数
	M.nu=n;
    
	for(int z=1;z<=100;z++)num[z]=0;

	for(cin>>i>>j>>e;i!=0;cin>>i>>j>>e)
	{//按任意次序输入非零元

		M.data[k].j=j;
	
		M.data[k].i=i;
	
		M.data[k].e=e;
	
		k++;
		}//for
	M.tu=k-1;

    M.rpos[1]=1;

	for(int a=1;a<=M.tu;++a)++num[M.data[a].i];
	
	for(int b=2;b<=M.mu;++b)M.rpos[b]=M.rpos[b-1]+num[b-1];
//初始化矩阵的行链接信息


}//CreateSMatrix


bool MultSMatrix(RLSMatrix M,RLSMatrix N,RLSMatrix &Q)
{
//进行两个矩阵相乘操作,并把结果压缩存入新矩阵Q
	int ctemp[100];

	int tp,t,ccol,brow,p,q,arow,lie;

	if(M.nu!=N.mu)return ERROR;

	Q.mu=M.mu;

	Q.nu=N.nu;

	Q.tu=0;
	//Q初始化

	if(M.tu*N.tu!=0)
	{
	for(arow=1;arow<=M.mu;++arow)
	{//处理M的每一行
       int w=arow;
            
		for(lie=1;lie<=N.nu;++lie)
			
			ctemp[lie]=0;			//当前行个元素累加器清零
	
		  Q.rpos[arow]=Q.tu+1;
	
		 
			  if(arow<M.mu)tp=M.rpos[arow+1];

		  
		  else {tp=M.tu+1;}

		  
        

		  for(p=M.rpos[arow];p<tp;++p)
		  {
		      //对当前行中的每一个非零元找到对应元在N中的行号
			  
			  brow=M.data[p].j;
		
	  
		   if(brow<N.mu)t=N.rpos[brow+1];
	
		      else {
				  t=N.tu+1;
			  }//else

	    for(q=N.rpos[brow];q<t;++q)
		{
		  ccol=N.data[q].j;			//乘积元素在Q中列号
	     
		  ctemp[ccol]+=M.data[p].e*N.data[q].e;
	
		}//for q;

			
	
		  }//for p;求得Q中第crow(=arow)行的非零元

			  
		  
	//压缩存储存储该行的非零元
	for(ccol=1;ccol<=Q.nu;++ccol)

		if(ctemp[ccol])
		{
			Q.tu++;

			if(Q.tu>MAXSIZE)return ERROR;
		      
			   Q.data[Q.tu].i=arow;
		         
			     Q.data[Q.tu].j=ccol;

		           Q.data[Q.tu].e=ctemp[ccol];
		
		}//if

	
	
	}//for arow
	
	}//if

return OK;
}//MultSMatrix


void Rmove(RLSMatrix &M,int p)

{//矩阵中非零元后移
	for(int a=M.tu+1;a>=p;a--)

{
		M.data[a].e=M.data[a-1].e;

		M.data[a].i=M.data[a-1].i;

		M.data[a].j=M.data[a-1].j;

}

}


void Lmove(RLSMatrix &M,int p)

{//矩阵中非零元左移
	for(int a=p;a<M.tu;a++)

{
		M.data[a].e=M.data[a+1].e;

			M.data[a].i=M.data[a+1].i;

				M.data[a].j=M.data[a+1].j;

}
}



bool PlusSMatrix(RLSMatrix &M,RLSMatrix N)
{
//进行两个矩阵的相加,即把第二个矩阵加到第一个矩阵上,如果在对应项上没有元素则插入,
	//如果相加为零
	//则在第一个矩阵中删除原来的元素

	int tp,t,p,q,arow,e;

	if(M.mu!=N.mu&&M.nu!=N.nu)return ERROR;

	
	if(M.tu*N.tu!=0)				//两个矩阵都为非零矩阵
	{
	for(arow=1;arow<=M.mu;++arow)
	
	{//逐行计算
       	
		  if(arow<M.mu)
			  
		  {
		   tp=M.rpos[arow+1];
		  
		   t=N.rpos[arow+1];
		  
		  }

		  else 
		  {tp=M.tu+1;
		   
		  t=N.tu+1;
		  }

		  for(p=M.rpos[arow],q=M.rpos[arow];p<tp||q<t;)

		  {
			  if(p==tp)			//第一个矩阵当前行是否还存在非零元

				  {Rmove(M,p);

		  M.data[p].e=N.data[q].e;

		  M.data[p].i=N.data[q].i;

		  M.data[p].j=N.data[q].j;

		  M.tu++;q++;

		  }

			  if(q==t)p++;					//第二个矩阵当前行是否还存在非零元
			  
			  int a=M.data[p].j;

		  int b=N.data[q].j;

		  if(a<b)p++;

		  else if(a>b)

		  {Rmove(M,p);						//插入第二个矩阵对应位置上第一个矩阵没有的元素

		  M.data[p].e=N.data[q].e;

		  M.data[p].i=N.data[q].i;

		  M.data[p].j=N.data[q].j;

		  M.tu++;

		  }

		  else 
		  
		  {e=M.data[p].e+N.data[q].e;			//相加
		  
		  

		 
		  M.data[p].e=e;

		  p++;
		  
		  q++;}//else 

		  		 		  
		  }//for q,p

		 

		  }//for arow
	}//if
			
return OK;
}	

void PrintSMatrix(RLSMatrix M)
{   

//以阵列形式打印矩阵	
	ElemType Search(RLSMatrix ,int ,int);
	for(int i=1;i<=M.mu;i++)
	{for(int j=1;j<=M.nu;j++)
		{ElemType e=Search(M,i,j);
   printf("%d ",e);}
	cout<<endl;}

}


void SubN(RLSMatrix &N)
{
	for(int i=1;i<=N.tu;i++)

	  N.data[i].e=-N.data[i].e;
}


bool SubSMatrix(RLSMatrix &M,RLSMatrix N)
{//进行两个矩阵的相减,这个算法是把第二个矩阵的非零元都乘上-1后加到第一个矩阵上

	SubN(N); 
  
  if(PlusSMatrix(M,N))return 1;

  else return 0;

	
}	
		  





ElemType Search(RLSMatrix M,int i,int j)
{
//查找矩阵中的非零元	
	for(int k=1;k<=M.tu;k++)
		if(M.data[k].i==i&&M.data[k].j==j)
			return M.data[k].e;
		return 0;
}





	


void main(int argc, char* argv[])
{
	RLSMatrix M,N,Q;
	int m,n;
    char  d='y';
	cout<<"欢迎用本程序进行矩阵运算!"<<endl;
	
loop:
	{
		
	cout<<"请输入第一个矩阵,先输入行数m再输入列数n"<<endl;
	cout<<"m=";
	cin>>m;
	cout<<"n=";
	cin>>n;
	CreateSMatrix(M,m,n);
	//建立第一个矩阵
    cout<<"第一个矩阵如下,请校对:"<<endl;
	PrintSMatrix(M);
	cout<<"请输入第二个矩阵,先输入行数m再输入列数n"<<endl;
	cout<<"m=";
	cin>>m;
	cout<<"n=";
	cin>>n;
	CreateSMatrix(N,m,n);			
	//建立第二个矩阵
	cout<<"第二个矩阵如下,请校对:"<<endl;
	PrintSMatrix(N);
    cout<<"请选择矩阵运算的类型:"<<endl;
	cout<<"(A)加法"<<endl<<"(B)减法"<<endl<<"(C)乘法"<<endl;
	char c;
	cin>>c;
	switch (c)
	{case 'a'://调用矩阵相加函数,并输出计算结果
	              if(PlusSMatrix(M,N))
				  {cout<<"M+N的结果为:"<<endl;PrintSMatrix(M);}
				  else {cout<<"输入矩阵行列数不相等,请重新输入"<<endl;
				  goto loop;}break;
	case 'b'://调用矩阵相减函数,并输出计算结果
		if( SubSMatrix(M,N)){
			cout<<"M-N的结果为:"<<endl;
	        
			PrintSMatrix(M);}
	 else {cout<<"输入矩阵行列数不相等,请重新输入"<<endl;
				  goto loop;}break;
	case 'c'://调用矩阵相乘函数,并输出计算结果
		if(	MultSMatrix(M,N,Q)){
	cout<<"运算结果为:"<<endl;
    PrintSMatrix(Q);
		}
		else {cout<<"第一个矩阵的列数不等于第二个矩阵的行数,请重新输入"<<endl;
				  goto loop;}break;}
	cout<<"Do you want to continue(Y/N)?"<<endl;
	if(cin.get()=='Y'||cin.get()=='y') goto loop;
	}
    cout<<"press any key to contine:"<<endl;
    cin.get();
   
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -