一、问题描述:

稀疏矩阵是指那些多数元素为零的矩阵。利用“稀疏”特点进行存储(只存储非零元)和计算可以大大节省存储空间,提高计算效率。实现一个能进行稀疏矩阵基本运算的运算器。

二、需求分析:

以“带行逻辑链接信息”的三元组顺序表表示稀疏矩阵,实现两个矩阵相加、相减和相乘的运算。稀疏矩阵的输入形式采用三元组表示,而运算结果的矩阵则以通常的阵列形式列出。稀疏矩阵的输出要求:矩阵的行数、列数、非零元个数,以及详细的矩阵阵列形式。

三、代码实现

#include <stdio.h>
#include <iostream>#define ERROR -1
#define MAXSIZE 12500    //非零元个数最大值MAXSIZE
#define MAXRC 21         //各行第一个非零元位置最大值MAXRC
#define OK 1typedef int ElemType;
typedef struct         //同课本P98
{int i,j;ElemType e;
} Triple;typedef struct       //同课本P100
{Triple data[MAXSIZE+1];             //非零元三元组表int rpos[MAXRC+1];                  //各行第一个非零元的位置表int mu,nu,tu;                       //矩阵的行数、列数和非零元个数
} RLSMatrix;void CreatSMatrix(RLSMatrix &M)             //建立以“带行链接信息”的三元组顺序表示的稀疏矩阵
{for(int i=1; i<=MAXRC+1; i++)M.rpos[i]=0;     //令所有的位置都为0printf("请输入矩阵的行数、列数和非零元个数(以空格隔开):");scanf("%d %d %d",&M.mu,&M.nu,&M.tu);for(int i=1; i<=M.tu; i++){printf("请用三元组形式输入矩阵的元素(行 列 非零元素):");scanf("%d %d %d",&M.data[i].i,&M.data[i].j,&M.data[i].e);}for(int i=1,j=1; i<=M.mu; i++)     //求M.rpos[i]{M.rpos[i]=j;while(M.data[j].i==i && j<=M.tu)  j++;        //若某一行的元素多于1个时}
}int MultsMatrix(RLSMatrix M,RLSMatrix N,RLSMatrix &Q)
{int brow,ccol,p,q,t,tp,ctemp[MAXRC+1],i;Q.mu=M.mu;     //Q初始化Q.nu=N.nu;Q.tu=0;if(M.nu!=N.mu)return ERROR;if(M.tu*N.tu)        //Q是非零矩阵{for(int arow=1; arow<=M.mu; ++arow) //处理M的每一行{for( i=1; i<=MAXRC+1; i++)ctemp[i]=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) //对当前行中每一个非零元{brow=M.data[p].j;                   //找到对应元在N中的行号if(brow<N.mu)t=N.rpos[brow+1];else{t=N.tu+1;}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}//求得Q中第crow(=arow)行的非零元for(ccol=1; ccol<=Q.nu; ++ccol)      //压缩存储该非零元if(ctemp[ccol]){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}//ifreturn 1;
}bool AddSMatrix(RLSMatrix M,RLSMatrix N,RLSMatrix &Q)  //矩阵相加
{if(M.mu!=N.mu||M.nu!=N.nu)return ERROR;int i,j,k=1;Q.mu=M.mu;Q.nu=M.nu;for(i=1,j=1; i<=M.tu&&j<=N.tu;){//按行优先,故分以下几种情况if(M.data[i].i==N.data[j].i)          //两元素同一行{if(M.data[i].j==N.data[j].j)         //两元素同一行且同一列(同位置){Q.data[k].i=M.data[i].i;Q.data[k].j=M.data[i].j;Q.data[k].e=M.data[i].e+N.data[j].e;i++;j++;k++;}else if(M.data[i].j<N.data[j].j)    //两元素同一行,但M中的元素列数较小{Q.data[k].i=M.data[i].i;Q.data[k].j=M.data[i].j;Q.data[k].e=M.data[i].e;k++;i++;}else if(M.data[i].j>N.data[j].j)    //两元素同一行,但M中的元素列数较大{Q.data[k].i=N.data[j].i;Q.data[k].j=N.data[j].j;Q.data[k].e=N.data[j].e;k++;j++;}}else if(M.data[i].i<N.data[j].i)        //M中的元素行数较小{Q.data[k].i=M.data[i].i;Q.data[k].j=M.data[i].j;Q.data[k].e=M.data[i].e;k++;i++;}else if(M.data[i].i>N.data[j].i)        //M中的元素行数较大{Q.data[k].i=N.data[j].i;Q.data[k].j=N.data[j].j;Q.data[k].e=N.data[j].e;k++;j++;}}if(i!=M.tu+1)                             //计算最后的元素for(; i<=M.tu; i++){Q.data[k].i=M.data[i].i;Q.data[k].j=M.data[i].j;Q.data[k].e=M.data[i].e;k++;}if(j!=N.tu+1)for(; j<=N.tu; j++){Q.data[k].i=N.data[j].i;Q.data[k].j=N.data[j].j;Q.data[k].e=N.data[j].e;k++;}for(i=1,j=1; i<=Q.mu; i++)      //求Q.rpos[i]{Q.rpos[i]=j;while(Q.data[j].i==i && j<=Q.tu)        //若某一行的元素多于1个时j++;}return OK;
}
void SubtSMatrix(RLSMatrix M,RLSMatrix &N,RLSMatrix &Q)
{//矩阵减法int i=1;for(; i<=N.tu; i++){N.data[i].e=-N.data[i].e;}AddSMatrix(M,N,Q);
}void PrintSMatrix(RLSMatrix M)
{//以通常阵列形式输出稀疏矩阵int k,l,n;for(k=1,n=1; k<=M.mu; k++){for(l=1; l<=M.nu; l++){if(M.data[n].i==k && M.data[n].j==l){printf("%5d",M.data[n].e);n++;}elseprintf("%5d",0);}printf("\n");}printf("\n");}
int Destory_SMatrix(RLSMatrix &M)
{M.mu=M.nu=M.tu=0;return 1;
}int main()
{RLSMatrix A,B,C;int flag;while(1){printf("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n");printf("         稀疏矩阵的加、减、乘         \n");printf("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n");printf("           1、稀疏矩阵的加法                           \n");printf("           2、稀疏矩阵的减法                           \n");printf("           3、稀疏矩阵的乘法                           \n");printf("           4、退出程序                                        \n");printf("━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n");printf("输入要进行的运算功能的编号:");scanf("%d",&flag);if(flag==4){printf("     \n程序已经退出!    \n");exit(0);}switch(flag){case 1:    //加法CreatSMatrix(A);printf("矩阵A=\n");PrintSMatrix(A);CreatSMatrix(B);printf("矩阵B=\n");PrintSMatrix(B);if(A.mu==B.mu  && A.nu==B.nu){printf("A+B=\n");AddSMatrix(A,B,C);PrintSMatrix(C);}elseprintf("错误!两矩阵的行列数不一致\n");break;case 2://减法CreatSMatrix(A);printf("矩阵A=\n");PrintSMatrix(A);CreatSMatrix(B);;printf("矩阵B=\n");PrintSMatrix(B);if(A.mu==B.mu  && A.nu==B.nu){printf("A-B=\n");SubtSMatrix(A,B,C);PrintSMatrix(C);}elseprintf("错误!两矩阵的行列数不一致\n");break;case 3://乘法CreatSMatrix(A);printf("矩阵A=\n");PrintSMatrix(A);CreatSMatrix(B);printf("矩阵B=\n");PrintSMatrix(B);if(A.nu==B.mu){printf("A*B=\n");MultsMatrix(A,B,C);PrintSMatrix(C);}elseprintf("错误!矩阵A的列数不等于矩阵B的行数\n");break;default:printf("输入错误!\n");}Destory_SMatrix(A);Destory_SMatrix(B);Destory_SMatrix(C);}return 0;
}

稀疏矩阵计算器(三元组实现矩阵加减乘法)相关推荐

  1. 矩阵的加减乘c语言程序,C语言实现的矩阵加减乘法运算系统

    C语言实现的矩阵加减乘法运算系统 /*本矩阵运算系统可以完成矩阵的加.减.乘法,但是只限于方阵*/ #include<stdio.h> #include<math.h> /*- ...

  2. 矩阵加 减 乘法的C语言实现

    矩阵的加减法:就是对应位置相加减即可 对于满足以下条件的矩阵A,B: 我们有: 加法, 减法, 矩阵的乘法: 对于满足以下条件的矩阵A,B,C: 我们有: 其中: 要注意的是矩阵群没有乘法交换律,也就 ...

  3. bigdecimal保留4位小数_四年级数学小数的加减乘法知识点汇总,带练习!

    张老师 - 4年级(多品小学教育) 顺城中心小学郭老师和环县虎洞中心小学谭老师需要的这份学习资料现在分享. 本资料已制作电子版 下载码是:76qa32vd <小数的加减乘法>知识点 一.小 ...

  4. 高精度加减乘法小程序

    复习高精度玩,写了个非常直观的加减乘程序. 1 Uses Math; 2 Var 3 a,b:AnsiSTring; 4 DC,la,lb:longint; 5 c:Array[-2555555..2 ...

  5. 数据结构——多项式的加减乘法以及合并同类项的算法

    测试数据(这里只测试了一组数据,小伙伴们可以自行测试其他数据喔) 2 2 3 3 4 4 0 0 1 2 2 2 0 0 1 2 1 1 0 0  1 2 1 3 0 0 -1 2 -5 3 -4 2 ...

  6. C++实现矩阵加减乘求转置

    一.需求如下: 二.代码如下: #include<vector> #include<iostream> using namespace std; class Matrix { ...

  7. opencv 把3通道图像转成单通道_小强学Python+OpenCV之-1.4.3图像(矩阵)加减运算

    引入 问题引入,考虑以下几个问题: Q1. 一个3通道像素p的BGR分量(8bit表示)值均相同,那么这个像素是什么颜色的? Q2. 该像素p加上自己,即,像素p的各个通道值翻倍,那么这个像素的颜色会 ...

  8. python实现一个简单的加法计算器_Python简易项目 加减计算器的实现

    Python Calculator 1.0 支持功能:add.minus 输入表达式不含括号,允许不加'=' 非常简单的一个小计算器,还缺少很多功能,目的是为了练练手. 日后会对其进行更新. 源码 # ...

  9. 使用栈实现计算器java(括号、加减、乘除)v2.0

    使用的类 计算器类 线性栈类(使用线性表存储数据) 线性表类 主类 这里是第一个版本的计算器,不过没有加入括号的运算法则 计算器类v1.0 运行结果: 图解: 计算器类 package Class.S ...

  10. 实例82 复数的加减乘法

    #include<stdio.h> #include <stdlib.h> #include<string.h> typedef struct MyComplex ...

最新文章

  1. DataWorks 如何设置调度依赖
  2. 向xxxhub发了一个数据包,发现了···
  3. 内存不能为读写的解决方法
  4. .Net Discovery系列之四 深入理解.Net垃圾收集机制(下)
  5. eclipse如何设置js源文件编码
  6. DyFPN:浙大华为诺亚西湖大学等提出用于目标检测的动态特征金字塔,减少40%的FLOPs!...
  7. mysql mybatis 返回值类型_使用MyBatis时接收值和返回值选择Map类型或者实体类型
  8. electron 打印需要联网的吗?_英语四六级考试准考证怎么打印,需要彩打吗
  9. 生成SSH秘钥连接github
  10. Android性能优化:布局优化 详细解析(含include、ViewStub、merge讲解 )
  11. java 将小数度数转换为度分秒格式
  12. bash 学习笔记2
  13. SpringMVC自定义拦截器拦截请求后返回中文时乱码
  14. java 数组或者链表输出
  15. OpenJDK8在LINUX上,输入法候选框无法正确定位
  16. 生成大量随机数(c语言)
  17. TJUPT 无法与服务器建立连接问题的解决方法
  18. 【zheng】学习搭建github的高星项目:zheng
  19. php ppt如何转换成pdf,ppt转pdf格式转换器 PPT批量转换成PDF 怎样把PPT格式转换成PDF格式...
  20. anroid获取ping值

热门文章

  1. html浮动垂直居中对齐,css如何设置垂直居中对齐?
  2. 微软/阿里/商汤等计算机视觉算法实习面经
  3. VREP学习记录(持续更新)
  4. 项目开发计划——机房收费系统
  5. 分享两款免费的流程图、原型图工具
  6. Kotlin学习笔记 —— 函数,字符串,可空性以及标准库函数(2)
  7. LocalDate获取每周第一天
  8. 【每日新闻】Gartner:区块链热度高但实际部署较少且面临挑战 | 阿里巴巴宣布研制出全球最强量子电路模拟器“太章”...
  9. Linux 如何查看文件夹的大小
  10. 软件开发过程与项目管理(5.软件项目任务分解)