稀疏矩阵的加法,三元组实现矩阵的乘法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include
#include
using namespace std;
const int MAXSIZE=100; // 定义非零元素的对多个数
const int MAXROW=10; // 定义数组的行数的最大值
typedef struct { // 定义三元组的元素
int i,j;
int e;
}Triple;
typedef struct { // 定义普通三元组对象
Triple data[MAXSIZE+1];
int mu,nu,tu;
}TSMatrix;
typedef struct { // 定义带链接信息的三元组对象
Triple data[MAXSIZE+2];
int rpos[MAXROW+1];
int mu,nu,tu;
}RLSMatrix;
template
bool InPutTSMatrix(P & T,int y){ //输入矩阵,按三元组格式输入cout<<"输入矩阵的行,列和非零元素个数:"< cin>>T.mu>>T.nu>>T.tu; cout<<"请输出非零元素的位置和值:"< int k=1; for(;k<=T.tu;k++) cin>>T.data[k].i>>T.data[k].j>>T.data[k].e; return true; } template bool OutPutSMatrix(P T){ // 输出矩阵,按标准格式输出 int m,n,k=1; for(m=0;m for(n=0;n if((T.data[k].i-1)==m&&(T.data[k].j-1)==n){ cout.width(4); cout< else{ cout.width(4); cout<<"0"; } } cout< } return true; } // 求矩阵的转置矩阵 bool TransposeSMatrix( ){ TSMatrix M,T; //定义预转置的矩阵 InPutTSMatrix(M, 0); //输入矩阵 int num[MAXROW+1]; int cpot[MAXROW+1]; // 构建辅助数组 int q,p,t; T.tu=M.tu; T.mu=M.nu; T.nu=M.mu; if(T.tu){ for(int col=1;col<=M.nu;col++) num[col]=0; for(t=1;t<=M.tu;t++) ++num[M.data[t].j]; cpot[1]=1; for(int i=2;i<=M.nu;i++) cpot[i]=cpot[i-1]+num[i-1]; // 求出每一列中非零元素在三元组中出现的位置 for(p=1;p<=M.tu;p++){ col=M.data[p].j; q=cpot[col]; T.data[q].i=col; T.data[q].j=M.data[p].i; T.data[q].e=M.data[p].e; ++cpot[col]; } } cout<<"输入矩阵的转置矩阵为"< OutPutSMatrix(T); return true; } bool Count(RLSMatrix &T) { int num[MAXROW+1]; for(int col=1;col<=T.mu;col++) num[col]=0; for(col=1;col<=T.tu;col++) ++num[T.data[col].i]; T.rpos[1]=1; for(int i=2;i<=T.mu;i++) T.rpos[i]=T.rpos[i-1]+num[i-1]; // 求取每一行中非零元素在三元组中出现的位置 return true; } // 两个矩阵相乘 bool MultSMatrix ( ){ RLSMatrix M,N,Q; // 构建三个带“链接信息”的三元组表示的数组 InPutTSMatrix(M,1); // 用普通三元组形式输入数组 InPutTSMatrix(N,1); Count(M); Count(N); if(M.nu!=N.mu) return false; Q.mu=M.mu; Q.nu=N.nu; Q.tu=0; // Q初始化 int ctemp[MAXROW+1]; // 辅助数组 int arow,tp,p,brow,t,q,ccol; if(M.tu*N.tu){ // Q是非零矩阵 for( arow=1;arow<=M.mu;arow++){ ///memset(ctemp,0,N.nu); for(int x=1;x<=N.nu;x++) // 当前行各元素累加器清零 ctemp[x]=0; Q.rpos[arow]=Q.tu+1; // 当前行的首个非零元素在三元组中的位置为此行前所有非零元素+1 if(arow else tp=M.tu+1; for(p=M.rpos[arow];p brow=M.data[p].j; // 在N中找到i值也操作元素的j值相等的行 if(brow else t=N.tu+1; for(q=N.rpos[brow];q ccol=N.data[q].j; ctemp[ccol] += M.data[p].e*N.data[q].e; // 将乘得到对应值放在相应的元素累加器里面 } } for(ccol=1;ccol<=Q.nu;ccol++) // 对已经求出的累加器中的值压缩到Q中 if(ctemp[ccol]){ if(++Q.tu>MAXSIZE) return false; Q.data[Q.tu].e=ctemp[ccol]; Q.data[Q.tu].i=arow; Q.data[Q.tu].j=ccol; } } } OutPutSMatrix(Q);