#include<stdio.h>
#include<stdlib.h>typedef struct {int i, j;int value;//三元组表有三个信息,对应为第i行,第j列,以及该元素元素值
}tuple;
struct sparmattp {//m,n分别对应矩阵的规模 ,t代表三元组表一共放了多少个元素 int m, n, t; tuple data[100];
};
void matrixset(struct sparmattp& a) {int cnt = 0;int i, j;int m, n, value;printf("Please input the row and the coloum of the matrix:\n");scanf("%d%d", &m, &n);for (i = 0; i < m; i++) {for (j = 0; j < n; j++) {scanf("%d", &value);//依次读入矩阵元素,如果该元素不为0,存入三元组表 if (value != 0) {a.data[cnt].value = value;a.data[cnt].i = i;a.data[cnt].j = j;//存下当前元素值,所在的行、列 cnt++;}}}a.m = m;a.n = n;a.t = cnt;
}
void matrixset2(int row, int coloum, struct sparmattp& a) {//该函数与前一个函数功能相似,只是这个是通过传参数来得知矩阵的规模,而不是通过键盘输入 int cnt = 0;int i, j;int m, n, value = 0;m = row;n = coloum;for (i = 0; i < m; i++) {for (j = 0; j < n; j++) {if (value == 0) {a.data[cnt].value = value;a.data[cnt].i = i;a.data[cnt].j = j;cnt++;}}}a.m = m;a.n = n;a.t = cnt;
}
int find(struct sparmattp& a, int i, int j) {//该函数用于寻找矩阵对应第i行第j列的元素 ,返回值即元素值 int cnt;for (cnt = 0; cnt < a.t; cnt++) {if (a.data[cnt].i == i && a.data[cnt].j == j) {return a.data[cnt].value;}}return 0;
}
/*矩阵加法定义的是矩阵a+矩阵b,能相加的条件为:两者规模相等,即rowa=rowb,colouma=coloumb。因为我们是使用三元表存放的矩阵,那么我们需要解决的问题则变为如何通过三元组表来进行矩阵加法我们可以通过cnt来得知两个矩阵分别有多少个元素,不满足相加条件时,先存小的那一个,然后小的cnt++;
*/
void matrixadd(struct sparmattp& a, struct sparmattp& b, struct sparmattp& c) {int cnt1 = 0, cnt2 = 0, cnt3 = 0;if (a.m == b.m&&a.n == b.n) {//判断能否相加,相加的条件是矩阵规模相等while (cnt1 < a.t && cnt2 < b.t) {//相加结束的条件是把矩阵所有元素遍历完if (a.data[cnt1].i == b.data[cnt2].i) {//如果两个矩阵对应的三元组表的当前元素所在的行相等if (a.data[cnt1].j == b.data[cnt2].j) {//如果列也相等,当然直接相加即可c.data[cnt3].value = a.data[cnt1].value + b.data[cnt2].value;c.data[cnt3].i = a.data[cnt1].i;c.data[cnt3].j = a.data[cnt1].j;cnt1++;cnt2++;cnt3++;}else if (a.data[cnt1].j > b.data[cnt2].j) {//列不相等,比较哪个列更小,因为我们是从左到右来建立三元组表的,把所在列更小的那一个元素存入新的三元组表中c.data[cnt3].value = b.data[cnt2].value;c.data[cnt3].i = b.data[cnt2].i;c.data[cnt3].j = b.data[cnt2].j;cnt3++;cnt2++;}else if (a.data[cnt1].j < b.data[cnt2].j) {c.data[cnt3].value = a.data[cnt1].value;c.data[cnt3].i = a.data[cnt1].i;c.data[cnt3].j = a.data[cnt1].j;cnt3++;cnt1++;}}//到这里是行相等的情况,从下面开始,将讨论行不相等的时候,相加结果的三元组表元素的存放else if (a.data[cnt1].i > b.data[cnt2].i) {//与上面讨论的一致,我们选取小的那一个,把它存到新的三元组表中c.data[cnt3].value = b.data[cnt2].value;c.data[cnt3].i = b.data[cnt2].i;c.data[cnt3].j = b.data[cnt2].j;cnt3++;cnt2++;}else if (a.data[cnt1].i < b.data[cnt2].i) {c.data[cnt3].value = a.data[cnt1].value;c.data[cnt3].i = a.data[cnt1].i;c.data[cnt3].j = a.data[cnt1].j;cnt3++;cnt1++;}}while (cnt1 == a.t && cnt2 < b.t) {c.data[cnt3].i = b.data[cnt2].i;c.data[cnt3].j = b.data[cnt2].j;c.data[cnt3].value = b.data[cnt2].value;cnt3++;cnt2++;}while (cnt1 < a.t && cnt2 == b.t) {c.data[cnt3].i = a.data[cnt1].i;c.data[cnt3].j = a.data[cnt1].j;c.data[cnt3].value = a.data[cnt1].value;cnt3++;cnt1++;}c.m = a.m;c.n = a.n;c.t = cnt3;//更新结果三元组表的信息}else {printf("你输入的两个矩阵不能相加!\n");}
}
/*矩阵1(m1*n1)*矩阵二(m2*n2)=矩阵3(m1*n2)前提是n1==m2cij=Σai*bj;
*/
void matrixmultiply(struct sparmattp& a, struct sparmattp& b, struct sparmattp& c) {int sum = 0;int cnt = 0;int i, j, k;if (a.n == b.m) {for (i = 0; i < a.m; i++) {for (j = 0; j < b.n; j++) {sum = 0;for (k = 0; k < a.n; k++) {sum = sum + find(a, i, k)*find(b, k, j);}//找出对应的aik以及bkjc.data[cnt].value = sum;c.data[cnt].i = i;c.data[cnt].j = j;cnt++;}}    c.m=a.m;c.n=b.n;c.t=cnt;     }else {printf("你输入的矩阵不满足乘法条件!\n");}
}
void printmatirx(struct sparmattp& ma) {int i, j, cnt = 0;printf("矩阵打印:\n");for (i = 0; i < ma.m; i++) {for (j = 0; j < ma.n; j++) {if (ma.data[cnt].i == i && ma.data[cnt].j == j) {printf("%d ", ma.data[cnt].value);cnt++;}else { printf("0 "); }}printf("\n");}//用来输出矩阵的代码
}
int main() {struct sparmattp ma, mb, mc;int m, n;matrixset(ma);matrixset(mb);matrixset2(ma.m, ma.n, mc);matrixadd(ma, mb, mc);printmatirx(mc);matrixmultiply(ma, mb, mc);printmatirx(mc);return 0;
}
  • 在编写加法函数的过程中,我们发现对退出循环的条件需要有更高的要求,而不是仅仅只是两个cnt同时到底,因为如果当一个cnt已经到底,另一个仍未到底的时候,结果三元组表仅与未到底的三元组表有关,而此时,若我们仍简单地继续比较两个三元组表的信息,将会产生错误结果
  • 因为我们知道三元组表多余的元素都为零,若此时再比较,结果矩阵将全部存入零。

基于三元组表的矩阵加法与乘法相关推荐

  1. python中矩阵加法_Python实现矩阵加法和乘法的方法分析

    本文实例讲述了python实现矩阵加法和乘法的方法.分享给大家供大家参考,具体如下: 本来以为python的矩阵用list表示出来应该很简单可以搞..其实发现有大学问. 这里贴出我写的特别不pytho ...

  2. 用Java矩阵的加减数乘运算_线性代数(2):矩阵运算之矩阵加法、乘法、除法...

    授人予鱼不如授人予渔,在<线性代数>的学习中,方法尤为重要.下面就让我们一起解决<线性代数>中令人头痛的--矩阵的加法运算吧! 前言:想要学会<线性代数>中的--矩 ...

  3. 矩阵加法减法乘法计算

    矩阵 最近在做重写帧同步矩阵相关运算的时候突然发现自己矩阵乘法运算怎么做了,这里参考别人文档写一篇让自己巩固下矩阵算法.(文章中括号就不画了,用 [ ] 代替了) 矩阵加法 计算公式如下 /// [ ...

  4. 稀疏矩阵的三元组表与十字链表存储

    三元组表:存储稀疏矩阵的非零元素,以及该元素所在的行.列信息,极大的节省了空间(如相比于一般的二维数组的存储),而且三元组表的某些算法的时间效率也要优于经典算法,如基于三元组表的一次快速转置算法等等 ...

  5. c语言三元组求矩阵加法,矩阵相加的算法(存储结构为三元组表)

    假设稀疏矩阵A和B均以三元组表作为存储结构.试写出矩阵相加的算法,另设三元组表C存放结果矩阵. 稀疏矩阵的三元组顺序表类型TSMatrix的定义: #define MAXSIZE 20 // 非零元个 ...

  6. 三元组法矩阵加法java_C语言实现矩阵加法、减法、乘法和数乘运算

    一.知识储备 • 矩阵与矩阵之间可以进行加法.减法和乘法运算(矩阵的"除法",被特别地定义出了逆矩阵,通过一个矩阵与另一个的逆矩阵的乘法来实现),矩阵和数之间可以进行数乘运算: • ...

  7. 【Android 应用开发】Paint 滤镜原理 之 颜色矩阵 ( 颜色模式 | 颜色通道 | 颜色矩阵 | 矩阵运算 | 矩阵乘法 | 矩阵加法 | 颜色矩阵深入解析 )

    文章目录 颜色模式 颜色通道 Android 中的颜色矩阵 矩阵乘法运算 滤镜中的矩阵乘法运算 矩阵加法运算 滤镜中的矩阵乘法运算 滤镜运算原理 ( 总结 ) 实际滤镜理论示例 颜色模式 颜色模式 : ...

  8. UESTC--ICODING数组与广义表-----矩阵加法

    UESTC--ICODING数组与广义表-----矩阵加法 题目: 相关定义如下: 代码: 文章供学习交流参考 题目: 实现三元组表示的两个稀疏矩阵的加法. 相关定义如下: ElemType elem ...

  9. c语言加法减法乘法,一元多项式的加法减法乘法c语言描述线性表应用

    一元多项式的加法减法乘法 --(c语言描述)线性表应用 来源:永远的北邮人 vc6.0下调试通过 #include #include #include #include #include #inclu ...

  10. 二维数组练习--矩阵的加法和乘法

    数组的练习示例展示: package arrayList; /*** 矩阵的集中运算法则:求和,求积,求逆矩阵,转置矩阵......* @author Drew**/ public class Arr ...

最新文章

  1. Linux内核源码树学习:Kconfig和Makefile
  2. 听说你想去大厂看妹子,带你看看腾讯产品运营实习面经
  3. ubuntu下Anaconda安装gym包
  4. 即时通讯成为热门传播媒体
  5. gitlab 只能owner 上传_代码管理-gitlab使用方法建议
  6. IdentityServer4之Client Credentials(客户端凭据许可)
  7. 线性分类模型和向量矩阵求导_自然语言处理中向量空间模型的矩阵设计
  8. 单片机51keil编程流程
  9. 随机信号分析学习笔记(3)
  10. c语言日志管理系统 --- zlog
  11. java会议室预约系统源码_基于jsp的会议室预订预约-JavaEE实现会议室预订预约 - java项目源码...
  12. html在线表格样式模板,纯css实现的table表格样式,教程站常用
  13. 信息安全工程07875 自考软件工程 助学班复习纲要
  14. java文件上传像素限制,JS上传图片前的限制包括(jpg jpg gif及大小高宽)等
  15. 根因定位论文:Root Cause Analysis of Anomalies of Multitier Services in Public Clouds
  16. android手机电池寿命,真正有效延长手机电池寿命的几点建议(iPhone+安卓)
  17. 日均5亿查询量,京东到家订单中心ES架构演进
  18. 如何去除图片水印不留痕迹_去水印工具
  19. 【睡觉中的阿狸!真的被萌到啦】
  20. 软件设计师考试重点知识点梳理

热门文章

  1. 学习雷达波,防护罩shader的记录
  2. 带视觉ABB机器人西门子PLC立库码垛机伺服 SCL和梯形图混编
  3. TokenRank硅谷首发上线 | 区块链投融资领域的“大众点评”
  4. 欧姆龙 CJ1W-ETN21通过DM赋值实现Socket功能
  5. 分享 APP竞品分析的几个工具
  6. 【技法操作】UI界面设计,用PS绘制音乐播放页面教程
  7. TCP/IP 和 HTTP不了解?看完这篇文章,网络知识就全懂了
  8. pytorch softmax dim=-1
  9. Java--javaBean、vo、entity、domain和pojo
  10. 从创意到产品概念——开发新产品的必要过程