稀疏矩阵的压缩存储方法及主要运算的实现

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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];

相关文档
最新文档