三元组实现稀疏矩阵加减乘参考模板_第1页
三元组实现稀疏矩阵加减乘参考模板_第2页
三元组实现稀疏矩阵加减乘参考模板_第3页
三元组实现稀疏矩阵加减乘参考模板_第4页
三元组实现稀疏矩阵加减乘参考模板_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、#include<stdio.h>#include<stdlib.h>#define MAXSIZE 12500/三元组结构typedef struct int i,j; /矩阵行下标和列下标 int e; /值Triple;/矩阵结构typedef struct Triple dataMAXSIZE+1; int rposMAXSIZE+1; /这是存放各行第一非零元在矩阵中的位置 int mu,nu,tu; /矩阵的行数、列数、非零元个数Matrix;void Init(Matrix* M);void Add(Matrix* M,Matrix* T,Matrix*

2、G);void Jian(Matrix* M,Matrix* T,Matrix* G);void Cheng(Matrix* M,Matrix* T,Matrix* G);void Cheng(Matrix* M,Matrix* T,Matrix* G);void PrintMatrix(Matrix* M);/2、初始化矩阵void Init(Matrix* M) int i; if(M->mu < 1 | M->nu < 1 | M->tu > M->mu*M->nu) 1 / 17 printf("出错!n"); /如果

3、矩阵的行数、列数不符合要求,打印出错 for(i=1;i<=M->tu;i+) /data0不用 printf("第%d个非零元的行号:",i); /以下为数据初始化 scanf("%d",&M->datai.i); printf("第%d个非零元的列号:",i); scanf("%d",&M->datai.j); printf("第%d个非零元的元素值:",i); scanf("%d",&M->datai.e); pri

4、ntf("n"); printf("您创建的矩阵如下:n"); PrintMatrix(M);/3、矩阵相加void Add(Matrix* M,Matrix* T,Matrix* G) G->mu = M->mu; /因为加减运算必须维数相等,所以M、T行、列数相等,初始化第三方矩阵的行、列数。 G->nu = M->nu; G->tu = 0; int g,m,t; /g、m、t分别记录三个矩阵的元素的存储位置 g = m = t = 1; /从data1开始 int k; int sum; /和 if(M->mu

5、 != T->mu | M->nu != T->nu) printf("维数不等!n"); for(k = 1;k <= M->mu;k+) /行下标和下标相等的对应元素相加 /*开始*/ if(M->datam.i = k && T->datat.i = k) /行下标相等时 if(M->datam.j = T->datat.j ) /列下标相等时 sum=M->datam.e+T->datat.e; /矩阵向加 if(sum != 0) /相加不为零时 G->datag.i=k; G

6、->datag.j=M->datam.j; G->datag.e=sum; G->tu+; g+; m+; t+; else /矩阵相加为零时,不做存储操作 m+; t+; /*结束*/ /行下标和下标不等的元素直接插入到G的相应位置 /*开始*/ while(M->datam.i = k) /插入M剩余的元素 G->datag.i = k; G->datag.j = M->datam.j; G->datag.e = M->datam.e; G->tu+; m+; g+; while(T->datat.i = k) /插入

7、T剩余的元素 G->datag.i = k; G->datag.j = T->datat.j; G->datag.e = T->datat.e; G->tu+; t+; g+; /G->tu=g; /记录运算完成后,第三方矩阵非零元的个数 /*结束*/ printf("n"); printf("相加后的矩阵如下:n");PrintMatrix(G);/4、矩阵相减void Jian(Matrix* M,Matrix* T,Matrix* G) G->mu = M->mu; G->nu = M-&

8、gt;nu; G->tu = 0; int sum,k; int m,t,g; m = t = g = 1; if(M->mu != T->mu | M->nu != T->nu) printf("维数不等!n"); for(k = 1;k <= M->mu;k+) /行下标和下标相等的对应元素相减 /*开始*/ if(M->datam.i = k && T->datat.i = k) /行下标相等时 if(M->datam.j = T->datat.j ) /列下标相等时 sum=M->

9、;datam.e-T->datat.e; /矩阵向减 if(sum != 0) /相加不为零时 G->datag.i=k; G->datag.j=M->datam.j; G->datag.e=sum; G->tu+; g+; m+; t+; else m+; t+; /*结束*/ /行下标和下标不等的元素直接插入到G的相应位置 /*开始*/ while(M->datam.i = k) /插入M剩余的元素 G->datag.i = k; G->datag.j = M->datam.j; G->datag.e = M->dat

10、am.e; G->tu+; m+; g+; while(T->datat.i = k) /插入T的元素 G->datag.i = k; G->datag.j = T->datat.j; G->datag.e = 0 - T->datat.e; G->tu+; t+; g+; /G->tu=g; /记录运算完成后,第三方矩阵非零元的个数 /*结束*/ printf("n"); printf("相减后的矩阵如下:n");PrintMatrix(G);/5、矩阵相乘void Cheng(Matrix* M,

11、Matrix* T,Matrix* G) int k,w,q,x,mrow,trow,gcol; int tmpMAXSIZE; /累加器 int numMAXSIZE; /记录矩阵的各行的第一个非零元的位置 int m,t,g; m = t = g = 1; w =1; if(M->nu != T->mu) /如果第一个矩阵的列数不等于第二个矩阵的行数 printf("这两个矩阵不能相乘!n"); /初始化 G->mu = M->mu; G->nu = T->nu; G->tu = 0; if(M->tu * T->t

12、u != 0) / /记录各个矩阵的各行的第一个非零元的位置 / /*开始*/ /记录矩阵M中各行非零元的个数 for(mrow = 1; mrow < M->mu; mrow+) /清零 nummrow = 0; for(w = 1;w <= M->tu;w+) k = M->dataw.i; numk+; M->rpos1 = 1; /第一行第一个非零元的位置在data的第一位 for(mrow = 2; mrow <= M->mu; mrow+) /第N行第一个非零元的位置 M->rposmrow = M->rposmrow-1

13、 + nummrow-1; printf("n"); printf("矩阵Mn"); for(mrow = 1;mrow <= M->mu; mrow+) printf("第%d行的第一个非零元在data中的序号是:(%d)",mrow,M->rposmrow); printf("n"); /记录矩阵T中各行非零元的个数 for(trow = 1; trow < T->mu; trow+) /清零 numtrow = 0; for(w = 1;w <= T->tu;w+)

14、k = T->dataw.i; numk+; T->rpos1 = 1; /第一行第一个非零元的位置在data的第一位 for(trow = 2; trow <= T->mu; trow+) /第N行第一个非零元的位置 T->rpostrow = T->rpostrow-1 + numtrow-1; printf("n"); printf("n"); printf("矩阵Tn"); for(trow = 1;trow <= T->mu; trow+) printf("第%d行的

15、第一个非零元在data中的序号是:(%d)",trow,T->rpostrow); printf("n"); /*结束*/ for(mrow = 1; mrow <= M->mu; mrow+) for(k = 1; k <= T->nu;k+) /当前行各元素累加器清零 tmpk = 0; G->rposmrow = G->tu + 1; /矩阵G的各行的第一个非零元在G->data中的位置 for(w = M->rposmrow;w < M->rposmrow+1;w+) trow = M-&g

16、t;dataw.j; /找到对应T的行号 if(trow < T->mu) x = T->rpostrow+1; else x = T->tu+1; for(q = T->rpostrow; q< x;q+) gcol = T->dataq.j; tmpgcol += M->dataw.e * T->dataq.e; /对应非零元累加 for(gcol = 1; gcol <= G->nu;gcol+) /压缩存储 if(tmpgcol) G->dataG->tu+1.i = mrow; G->dataG-&g

17、t;tu+1.j = gcol; G->dataG->tu+1.e = tmpgcol; G->tu+; printf("n"); printf("相乘后的矩阵如下:n"); PrintMatrix(G);/6、矩阵打印void PrintMatrix(Matrix* M) int k; printf("非零元素数%dn",M->tu); for(k = 1;k <= M->tu;k+) printf("(%d,%d,%d)n",M->datak.i,M->datak

18、.j,M->datak.e); /7、主函数int main(int argc, char* argv) Matrix* M =(Matrix*)malloc(sizeof(Matrix); Matrix* T =(Matrix*)malloc(sizeof(Matrix); Matrix* G =(Matrix*)malloc(sizeof(Matrix); int tag = 1; int n; printf("请输入第一个矩阵的行数和列数:"); scanf("%d %d",&(M->mu),&(M->nu); printf("非零元的个数:"); scanf("%d",&(M->tu); Init(M); printf("n"); printf("请输入第二个矩阵的行数和列数:"); scanf("%d %d",&(T->mu),&(T->nu); printf("

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论