最新要闻
- 世界热点!全国第一!广西率先实现双千兆网络覆盖所有行政村
- 天天视讯!微软技术测试“玩出”新花样:实现《我的世界》AI自动建造
- 【环球快播报】公园飞无人机 被男子一板凳拍在地上:怕伤到孩子
- 环球新消息丨为1个亿目标 26岁“背景太假哥”拼了:每天冒严寒、酷暑直播
- 全球看点:智慧管理+贴心服务,这座网红公厕不“简单”
- RTX 4070笔记本挤牙膏?只比RTX 3070快了11%
- 天天热资讯!史上第25个!浙江彩民69元中2.4亿元巨奖 网友调侃:又骗我买彩票
- 全球热讯:不能“回血”了!微软大作《红霞岛》实体版仅提供激活码
- 0反式脂肪酸!旺旺邦德轻乳咖啡官方清仓:9瓶1盒仅19.9元
- 目标基辅号
- 环球观点:鹡鸰女神第2集-鹡鸰女神无修版
- 环球新动态:雷军宣布小米参加MWC 2023大会!铁大、铁蛋机器人海外亮相
- 上海一特斯拉再现失控事故:成道路护栏“终结者”
- 全球实时:插混和增程路线谁更好?院士欧阳明高给出答案
- 上海中环内圈发生单车事故 官方通报:车辆起火翻滚地面 驾驶员死亡
- 全球新资讯:ChatGPT大火 马斯克批OpenAI违背初心:被微软控制 只顾赚钱
广告
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
[数据结构] 稀疏矩阵的加法与乘法
(相关资料图)
稀疏矩阵的加法
传统矩阵的加法
矩阵相加的前提是两个矩阵的行数和列数相等,将矩阵的每个元素对应相加即可。
void NormalAddMatrix(int A[][N], int B[][N], int C[][N]){ for(int i = 0; i < m; i ++ ) for(int j = 0; j < n; j ++ ) C[i][j] = A[i][j] + B[i][j];}
稀疏矩阵的加法
稀疏矩阵是由三元组表表示的,在进行矩阵相加的操作时,需要对当前两个非零元行列的情况进行分类:1.当前两个非零元行相同(1)当前 A遍历到的非零元的列小于当前 B遍历到的非零元的列:将 A此时的非零元加入到 C的三元组表中(2)当前 A遍历到的非零元的列大于当前 B遍历到的非零元的列:将 B此时的非零元加入到 C的三元组表中(3)当前 A遍历到的非零元的列等于当前 B遍历到的非零元的列:将 A此时的非零元和 B此时非零元相加后加入到 C的三元组表中
2.当前两个非零元行不相同(1)A中的非零元已经遍历完了 或者 A此时的非零元的行大于B的非零元的行:将 B此时的非零元加入到 C的三元组表中(2)B中的非零元已经遍历完了 或者 A此时的非零元的行小于B的非零元的行:将 A此时的非零元加入到 C的三元组表中
//稀疏矩阵三元组加法void AddSMatrix(TSMatrix a, TSMatrix b, TSMatrix &c){ int i = 0, j = 0, k = 0; ElemType v; //用于计算和 if(a.mu != b.mu || a.nu != b.nu){ //两矩阵无法相加 printf("两矩阵无法相加。\n"); return; } c.mu = a.mu; c.nu = a.nu; while(i < a.tu || j < b.tu){ //若行相等,看列 if(a.data[i + 1].i == b.data[j + 1].i){ //行相同时的第一种情况 if(a.data[i + 1].j < b.data[j + 1].j){ c.data[k + 1].i = a.data[i + 1].i; c.data[k + 1].j = a.data[i + 1].j; c.data[k + 1].e = a.data[i + 1].e; k++; i++; //前往下一个a中的非0元 } //行相同时的第二种情况 else if(a.data[i + 1].j > b.data[j + 1].j){ c.data[k + 1].i = b.data[j + 1].i; c.data[k + 1].j = b.data[j + 1].j; c.data[k + 1].e = b.data[j + 1].e; k++; j++; //前往下一个b中的非0元 } //行相同的第三种情况 else{ v = a.data[i + 1].e + b.data[j + 1].e; if(v != 0){ c.data[k + 1].i = a.data[i + 1].i; c.data[k + 1].j = a.data[i + 1].j; c.data[k + 1].e = v; k++; } i++; j++; } } //若行不相同 的两种情况 else if(i == a.tu || a.data[i + 1].i > b.data[j + 1].i && j != b.tu){ c.data[k + 1].i = b.data[j + 1].i; c.data[k + 1].j = b.data[j + 1].j; c.data[k + 1].e = b.data[j + 1].e; k++; j++; //前往下一个b的非0元 } else if(j == b.tu || a.data[i + 1].i < b.data[j + 1].i && i != a.tu){ c.data[k + 1].i = a.data[i + 1].i; c.data[k + 1].j = a.data[i + 1].j; c.data[k + 1].e = a.data[i + 1].e; k++; i++; //前往下一个a的非0元 } } c.tu = k;}
稀疏矩阵的乘法
传统矩阵的乘法
矩阵相乘的前提是矩阵 A的列数等于矩阵 B的行数,假设矩阵 A是一个 m * l的矩阵, B是一个 l * n的矩阵,两者相乘后得到一个 m * n的新矩阵 *C。
void NormalMultMatrix(int A[][N], int B[][N], int C[][N]){ for(int i = 0; i < m; i ++ ) for(int j = 0; j < n; j ++ ) for(int k = 0; k < l; k ++ ) C[i][j] += A[i][k] * B[k][j];}
稀疏矩阵的乘法
乘法辅助函数
我们可以仿照传统矩阵乘法的样式来实现三元组表示矩阵的相乘,对于相乘后得到的矩阵 C,每个元素即 C[i][j],其实只需要在 A和 B中找到对应下标相同的 A[i][k]和 B[k][j]即可。
//乘法辅助函数 找到对应下标相同的元素 A[i][k] 和 B[k][j]int Getval(TSMatrix a, int i, int j){ int k = 1; //矩阵三元组下标 while(k <= a.tu && (a.data[k].i != i || a.data[k].j != j)) k++; if(k <= a.tu) return a.data[k].e; else return 0;}
稀疏矩阵的乘法代码
有了这个辅助函数,就可以轻松实现三元组表示的矩阵的乘法了。
//稀疏矩阵三元组乘法void MultSMatrix(TSMatrix a, TSMatrix b, TSMatrix &c){ int p = 0; ElemType s; if(a.nu != b.mu){ printf("两矩阵无法相乘\n"); return; } for(int i = 1; i <= a.mu; i++){ for(int j = 1; j <= b.nu; j++){ s = 0; for(int k = 1; k <= a.nu; k++) s += Getval(a, i, k) * Getval(b, k, j); if(s != 0){ c.data[p + 1].i = i; c.data[p + 1].j = j; c.data[p + 1].e = s; p++; } } } c.mu = a.mu; c.nu = b.nu; c.tu = p;}
程序测试
完整程序代码
点击查看代码
#include #include #define MAXSIZE 10000typedef int ElemType;typedef struct{ int i, j; ElemType e;}Triple;typedef struct{ Triple data[MAXSIZE]; int mu, nu, tu; //矩阵行数,列数和非0元个数}TSMatrix;//输入稀疏矩阵数据void InPutM(TSMatrix &M){ printf("输入稀疏矩阵的 行数, 列数, 非0元个数 :\n"); scanf("%d %d %d", &M.mu, &M.nu, &M.tu); printf("输入矩阵非0元素的 所在行i, 所在列j, 值e:\n"); for(int k = 1; k <= M.tu; k++){ scanf("%d %d %d", &M.data[k].i, &M.data[k].j, &M.data[k].e); }}//打印稀疏矩阵三元组数据void PrintM(TSMatrix T){ printf(" %d %d %d\n", T.mu, T.nu, T.tu); printf(" ------------\n"); for(int k = 1; k <= T.tu; k++){ printf(" %d %d %d\n",T.data[k].i, T.data[k].j, T.data[k].e); }}//稀疏矩阵三元组加法void AddSMatrix(TSMatrix a, TSMatrix b, TSMatrix &c){ int i = 0, j = 0, k = 0; ElemType v; //用于计算和 if(a.mu != b.mu || a.nu != b.nu){ //两矩阵无法相加 printf("两矩阵无法相加。\n"); return; } c.mu = a.mu; c.nu = a.nu; while(i < a.tu || j < b.tu){ //若行相等,看列 if(a.data[i + 1].i == b.data[j + 1].i){ //行相同时的第一种情况 if(a.data[i + 1].j < b.data[j + 1].j){ c.data[k + 1].i = a.data[i + 1].i; c.data[k + 1].j = a.data[i + 1].j; c.data[k + 1].e = a.data[i + 1].e; k++; i++; //前往下一个a中的非0元 } //行相同时的第二种情况 else if(a.data[i + 1].j > b.data[j + 1].j){ c.data[k + 1].i = b.data[j + 1].i; c.data[k + 1].j = b.data[j + 1].j; c.data[k + 1].e = b.data[j + 1].e; k++; j++; //前往下一个b中的非0元 } //行相同的第三种情况 else{ v = a.data[i + 1].e + b.data[j + 1].e; if(v != 0){ c.data[k + 1].i = a.data[i + 1].i; c.data[k + 1].j = a.data[i + 1].j; c.data[k + 1].e = v; k++; } i++; j++; } } //若行不相同 的两种情况 else if(i == a.tu || a.data[i + 1].i > b.data[j + 1].i && j != b.tu){ c.data[k + 1].i = b.data[j + 1].i; c.data[k + 1].j = b.data[j + 1].j; c.data[k + 1].e = b.data[j + 1].e; k++; j++; //前往下一个b的非0元 } else if(j == b.tu || a.data[i + 1].i < b.data[j + 1].i && i != a.tu){ c.data[k + 1].i = a.data[i + 1].i; c.data[k + 1].j = a.data[i + 1].j; c.data[k + 1].e = a.data[i + 1].e; k++; i++; //前往下一个a的非0元 } } c.tu = k;}//乘法辅助函数int Getval(TSMatrix a, int i, int j){ int k = 1; //矩阵三元组下标 while(k <= a.tu && (a.data[k].i != i || a.data[k].j != j)) k++; if(k <= a.tu) return a.data[k].e; else return 0;}//稀疏矩阵三元组乘法void MultSMatrix(TSMatrix a, TSMatrix b, TSMatrix &c){ int p = 0; ElemType s; if(a.nu != b.mu){ printf("两矩阵无法相乘\n"); return; } for(int i = 1; i <= a.mu; i++){ for(int j = 1; j <= b.nu; j++){ s = 0; for(int k = 1; k <= a.nu; k++) s += Getval(a, i, k) * Getval(b, k, j); if(s != 0){ c.data[p + 1].i = i; c.data[p + 1].j = j; c.data[p + 1].e = s; p++; } } } c.mu = a.mu; c.nu = b.nu; c.tu = p;}int main(){ TSMatrix A, B, C, D; printf("输入稀疏矩阵A的三元组:\n"); InPutM(A); PrintM(A); printf("\n输入稀疏矩阵B的三元组:\n"); InPutM(B); PrintM(B); printf("\n矩阵A与B相加得到矩阵C:\n"); AddSMatrix(A, B, C); PrintM(C); printf("\n矩阵A与B相乘得到矩阵D:\n"); MultSMatrix(A, B, D); PrintM(D);}
测试运行结果
[数据结构] 稀疏矩阵的加法与乘法
世界热点!全国第一!广西率先实现双千兆网络覆盖所有行政村
天天视讯!微软技术测试“玩出”新花样:实现《我的世界》AI自动建造
观焦点:Module理解及使用
环球今日报丨【算法训练营day49】LeetCode121. 买卖股票的最佳时机 LeetCode122. 买卖股票的最佳时机II
全球时讯:IDEA如何使用Maven不通过模板创建javaWeb项目
【速看料】golang执行命令 && 实时获取输出结果
【速看料】[Qt开发/毕业设计/求职项目]局域网环境下远程文件发送部署系统-服务端、客户端双端的讲解
【环球快播报】公园飞无人机 被男子一板凳拍在地上:怕伤到孩子
环球新消息丨为1个亿目标 26岁“背景太假哥”拼了:每天冒严寒、酷暑直播
全球看点:智慧管理+贴心服务,这座网红公厕不“简单”
【快播报】[数据结构] 稀疏矩阵的转置与快速转置
天天微动态丨关于Linux升级内核时报错-grub2-editenv: error: environment block too small.
RTX 4070笔记本挤牙膏?只比RTX 3070快了11%
天天热资讯!史上第25个!浙江彩民69元中2.4亿元巨奖 网友调侃:又骗我买彩票
全球热讯:不能“回血”了!微软大作《红霞岛》实体版仅提供激活码
焦点报道:0X01 位运算笔记
P4171 满汉全席
0反式脂肪酸!旺旺邦德轻乳咖啡官方清仓:9瓶1盒仅19.9元
目标基辅号
环球观点:鹡鸰女神第2集-鹡鸰女神无修版
环球新动态:雷军宣布小米参加MWC 2023大会!铁大、铁蛋机器人海外亮相
【世界快播报】(数据库系统概论|王珊)第五章数据库完整性-第四、六、七节:约束命名子句、断言和触发器
上海一特斯拉再现失控事故:成道路护栏“终结者”
全球实时:插混和增程路线谁更好?院士欧阳明高给出答案
上海中环内圈发生单车事故 官方通报:车辆起火翻滚地面 驾驶员死亡
每日速讯:F - 树状数组 2【GDUT_22级寒假训练专题五】
全球新资讯:ChatGPT大火 马斯克批OpenAI违背初心:被微软控制 只顾赚钱
贵南高铁全线静态验收:时速350公里 南宁到贵阳时间缩短一半
速看:05-python运算符
【全球聚看点】字节二面:10Wqps超高流量系统,如何设计?
全球快看:动态规划解决最值、有多少方案之类问题
[奶奶看了都会]ChatGPT接入企业微信成为聊天机器人
世界观热点:蹲夜叉还有意外收获?变异蝴蝶直接就往脸上刷啊!
今日热讯:暴雪宣布《暗黑4》新雕像
43年的友情!马云低调现身墨尔本 与昔日好友相见
每日视点!男子将比亚迪海豚改装称房车:车内洗澡、看电影、吃火锅
全球热点!仿豆瓣发布-编辑框自适应高度,自动滚动定位到焦点输入
今日热门!(数据库系统概论|王珊)第五章数据库完整性-第一、二、三节:数据库三大完整性
精选!特斯拉前脸被完全撞烂 气囊没弹!车主:可以去维权吗?
当前聚焦:《地下城与勇士》大面积更改名称、美术素材 玩家喊话中消协:退钱
环球通讯!特斯拉创始人:自动驾驶是胡扯 汽车不应像iPhone
【天天新要闻】AMD、NV把显卡卖到万元 Intel成救星:下代能冲RTX 4080
手机预置软件影响用户体验 央媒揭秘幕后原因:厂商利益驱动
全球视点!苹果上新348元省电保护膜!网友:觉得贵的不是目标客户
读Java实战(第二版)笔记14_CompletableFuture及反应式编程背后的概念
如果我种一个橄榄核,它会长成一棵树吗?
天天即时:全球第10 三星Galaxy S23 Ultra相机DXO等分140:不敌小米11 Ultra
《塞尔达传说:王国之泪》日本最新海报曝光:腐朽大师剑现身
讯息:《生化危机4:重制版》硬件要求出炉:开光追 A卡很受伤
仰望银河背后 吉利是真着急了
散片就是这么来的?男子腰缠155片CPU入境被海关查获
【全球热闻】SpringBoot中统一API返回格式的两种方式
焦点消息!C#两个特殊的集合类StringCollection与StringDictionary
每日聚焦:03-数据类型
快播:期末复习——虚拟内存
速讯:04-数据类型转换
当前报道:安卓机皇!三星Galaxy S23 Ultra下周首销:价格对标iPhone 14 Pro Max
环球热讯:蜜雪冰城门店没关音响扰民一宿 客服:门店整改 向周围居民送冰淇淋致歉
RTX 40系移动平台性能测试出炉:RTX 4080与RTX 4090差距极小
世界新消息丨日本新生儿数量首次跌破80万 创有统计以来最低值:789万老人还在打零工
全球快播:iPhone 14最高降1600元 苹果经销商贴本卖机:谁还买安卓?
九型性格系统_0型血女生的性格
世界快资讯丨首届中国非遗保护年会开幕 四川非遗项目精彩亮相
简讯:超过年限要报废!老人用高压锅炖肉脸部被重伤
女子网购奶粉4个月吃剩半罐退货:被店家吐槽似乞丐
官方称《狂飙》拍摄地拍照收费算勒索: “刀哥”回应不是我 行为不可取
头条焦点:伸展树(Splay)详解
当前简讯:期末复习——内存管理
报道:django连接ubuntu22下的mysql8
打造自己的ChatGPT:逐字打印的流式处理
从矩阵的谱半径到神经网络梯度消失
当前速读:女子厨房接水时速热水龙头突然爆炸冒白烟:爆炸声堪比雷响
【天天时快讯】特斯拉Model 3追尾公交1死1伤 事故已影响销售:网友关心刹车问题
全球快资讯丨女子屋内湿度表1年数值不变 好奇拆下检查后无语:还以为是坏的
世界时讯:【JS】Pug调用自定义JS函数
头条:Java正则匹配域名白名单
曾经很火但消失了的APP!网友第一个想到的是”腾讯微博“
环球即时:女子入住网红酒店发现床垫有尿渍:满房一股味
防AI越界!微软将出手:把必应聊天回复限制在5条以内
天天热文:全球最高安全标准 我国自研华龙一号技术:太平岭核电预计2025年投产发电
天天热资讯!挑战全网最土的“公主下午茶” 让人看饿:网友感慨羞辱多少爱装腔作势人
【新要闻】组合数学_第1章_排列与组合
每日消息!称霸意甲的非洲新一代神锋,奥斯梅恩正在征服足坛
让NV对30系显卡降价不可能!厂商清仓RTX 3080:2年后价格重回首发价
全球观速讯丨《文明6》已玩腻 等了7年的《文明7》官宣:主管大换血
环球关注:tui.editor一款功能强大的markdown编辑器
热消息:关于python中将字典的所有key组成一个列表的方式
【环球报资讯】Cesium CallbackProperty(十五)
【世界独家】全天候显示能掉多少电?iOS 16.4告诉你
环球观速讯丨公司回应要求员工扫厕所:这是福利 每月有几十元奖励
焦点日报:冲击40亿有望!《流浪地球2》累计票房已超38亿
女子情人节翻垃圾桶捡到金链:最后被前主人要回 网友热议
全球速读:【算法训练营day48】LeetCode198. 打家劫舍 LeetCode213. 打家劫舍II LeetCode337. 打家劫舍III
GitHub 入门 与 2023年2月18日10:29:02
观天下!假的!马斯克否认修改算法推荐自己帐号 将追责说谎员工
环球微动态丨颠覆性创新 潍柴全球首发大功率SOFC燃料电池:研发花了20亿
环球新资讯:学习笔记——尚好房项目的数据库建表文件
VirtualBox 配置虚拟机 Host-only 和 Nat
世界百事通!win系统提示请插入多卷集的最后一张磁盘解决方法