稀疏矩阵的压缩存储方法及主要运算的实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1.实验目的:
掌握稀疏矩阵的压缩存储方法及主要运算的实现。
2.实验内容与要求:
设计一个稀疏矩阵计算器,要求能够:⑴输入并建立稀疏矩阵;⑵输出稀疏矩阵;⑶执行两个矩阵相加;⑷执行两个矩阵相乘;⑸求一个矩阵的转置矩阵。
3.数据结构设计
逻辑结构:线性结构
存储结构:顺序存储结构
4.算法设计
#include
#define MAXSIZE 100
typedef int datatype;
typedef struct
{ int i,j;
datatype v;
}Triple;
typedef struct
{ Triple data[MAXSIZE+1];
int rpos[MAXSIZE+1];
int mu,nu,tu;
}RLSMatrix;
int main()
{ void AddSMatrix(RLSMatrix M);
void MultSMatrix(RLSMatrix M);
void FastTransposeSMatrix(RLSMatrix M);
RLSMatrix M;
int k;
printf("请输入稀疏矩阵M的行数、列数和非零元素个数:");
scanf("%d%d%d",&M.mu,&M.nu,&M.tu);
printf("请输入稀疏矩阵M中非零元素的行号、列号和元素的值:\n");
for(k=1;k<=M.tu;k++)
scanf("%d%d%d",&M.data[k].i,&M.data[k].j,&M.data[k].v);
printf("请输出稀疏矩阵M中非零元素的行号、列号和元素的值:\n");
for(k=1;k<=M.tu;k++)
{ printf("%d%3d%3d",M.data[k].i,M.data[k].j,M.data[k].v);
printf("\n");
}
AddSMatrix(M);
MultSMatrix(M);
FastTransposeSMatrix(M);
return 0;
}
void AddSMatrix(RLSMatrix M)
{ RLSMatrix N,R;
int k,l=1,s=1;
printf("请输入稀疏矩阵N的行数、列数和非零元素个数:");
scanf("%d%d%d",&N.mu,&N.nu,&N.tu);
printf("请输入稀疏矩阵N中非零元素的行号、列号和元素的值:\n"); for(k=1;k<=N.tu;k++)
scanf("%d%d%d",&N.data[k].i,&N.data[k].j,&N.data[k].v);
if(M.mu!=N.mu||M.nu!=N.nu) printf("错误\n");
else
{ R.mu=M.mu;
R.nu=M.nu;
k=1;
if(M.tu*N.tu!=0)
{ while(k<=M.tu&&l<=N.tu)
{ if(M.data[k].i==N.data[l].i)
{ if(M.data[k].j { R.data[s].i=M.data[k].i; R.data[s].j=M.data[k].j; R.data[s].v=M.data[k].v; k++; s++; } else if(M.data[k].j==N.data[l].j) { R.data[s].i=M.data[k].i; R.data[s].j=M.data[k].j; R.data[s].v=M.data[k].v+N.data[l].v; if(R.data[s].v!=0) s++; k++; l++; } else { R.data[s].i=N.data[l].i; R.data[s].j=N.data[l].j; R.data[s].v=N.data[l].v; l++; s++; } } else if(M.data[k].i { R.data[s].i=M.data[k].i; R.data[s].j=M.data[k].j; R.data[s].v=M.data[k].v; k++; s++; } else { R.data[s].i=N.data[l].i; R.data[s].j=N.data[l].j; R.data[s].v=N.data[l].v; l++; s++; } } while(k<=M.tu) { R.data[s].i=M.data[k].i; R.data[s].j=M.data[k].j; R.data[s].v=M.data[k].v; k++; s++; } while(l<=N.tu) { R.data[s].i=N.data[l].i; R.data[s].j=N.data[l].j; R.data[s].v=N.data[l].v; l++; s++; } } printf("请输出稀疏矩阵M和稀疏矩阵N的和矩阵R中非零元素的行号、列号和元素的值:\n"); for(k=1;k printf("%d%3d%3d\n",R.data[k].i,R.data[k].j,R.data[k].v); } } void MultSMatrix(RLSMatrix M) { RLSMatrix D,Q; int num1[MAXSIZE],num2[MAXSIZE],ctemp[MAXSIZE],arow,brow,ccol,p,q,tp,t; printf("请输入稀疏矩阵D的行数、列数和非零元素个数:"); scanf("%d%d%d",&D.mu,&D.nu,&D.tu); printf("请输入稀疏矩阵D中非零元素的行号、列号和元素的值:\n"); for(t=1;t<=D.tu;t++) scanf("%d%d%d",&D.data[t].i,&D.data[t].j,&D.data[t].v); for(ccol=1;ccol<=M.mu;ccol++) num1[ccol]=0; for(t=1;t<=M.tu;t++) num1[M.data[t].i]++; M.rpos[1]=1; for(ccol=2;ccol<=M.mu;ccol++) M.rpos[ccol]=M.rpos[ccol-1]+num1[ccol-1];