十五、稀疏矩阵的乘法运算
十五、稀疏矩阵的乘法运算
文章目录
- 十五、稀疏矩阵的乘法运算
- 题目描述
- 解题思路
- 上机代码
题目描述
数据压缩是提高传输、存储效率一种技术。教材第5章介绍了两种简单的压缩存储方法。
本实验要求实现两个稀疏矩阵相乘积的算法**。其中稀疏矩阵非零元素数量小于100.**
输入:
第1个稀疏矩阵的行数
- 列数
- 非零元个数(三个数都大于0)
- 三元组
第2个稀疏矩阵的行数
- 列数
- 非零元个数(三个数都大于0)
- 三元组
以行为主序输入稀疏矩阵三元组表
输出:
乘积矩阵的行数
列数
非零元个数(三个数都大于0)
三元组
测试输入 | 期待的输出 | 时间限制 | 内存限制 | 额外进程 | |
---|---|---|---|---|---|
测试用例 1 |
3 4 4 1 1 3 1 4 5 2 2 -1 3 1 2 4 2 4 1 2 2 2 1 1 3 1 -2 3 2 4 |
3 2 3 1,2,6 2,1,-1 3,2,4 |
1秒 | 256KB | 0 |
解题思路
教材第 100 页指出,为了便于随机存取任意一行的非零元,需要知道每一行的第一个非零元在三元组表中的位置。因此,把指示 “行” 信息的辅助数组 cpot 固定在稀疏矩阵的存储结构中,称这种 “带行链接信息” 的三元组表为行逻辑链接的顺序表。
/* 行逻辑链接顺序表 */
typedef struct {Triple data[1000]; //非零元三元组表int rpos[1000]; //各行第一个非零元的位置表int mu, nu, tu; //矩阵的行数、列数和非零元个数
}RLSMatrix;
教材第 102 页给出了稀疏矩阵乘法的基本操作描述和算法流程实现。
上机代码
#include<cstdio>
#include<stack>
#include<cstring>
#include<cstdlib>
#include<iostream>
using namespace std;//定义三元组和顺序表
typedef struct {int i, j;int e;
}Triple;
typedef struct {Triple data[1000];int rpos[1000];int mu, nu, tu;
}RLSMatrix;
int rpos[1000];
int num[1000];int main()
{int arow = 0, brow = 0, tp = 0;int col = 0, ccol = 0;int p = 0, t = 0, q = 0;RLSMatrix M, N, Q;//输入M、N矩阵数据scanf("%d%d%d", &M.mu, &M.nu, &M.tu);for (int i = 1; i <= M.tu; i++)scanf("%d%d%d", &M.data[i].i, &M.data[i].j, &M.data[i].e);scanf("%d%d%d", &N.mu, &N.nu, &N.tu);for (int i = 1; i <= N.tu; i++)scanf("%d%d%d", &N.data[i].i, &N.data[i].j, &N.data[i].e);for (col = 1; col <= M.mu; col++)num[col] = 0;for (int i = 1; i <= M.tu; i++)num[M.data[i].i]++;M.rpos[1] = 1;for (col = 2; col <= M.mu; col++)M.rpos[col] = M.rpos[col - 1] + num[col - 1];for (col = 1; col <= N.mu; col++)num[col] = 0;for (int i = 1; i <= N.tu; i++)num[N.data[i].i]++;N.rpos[1] = 1;for (col = 2; col <= N.mu; col++)N.rpos[col] = N.rpos[col - 1] + num[col - 1];/* 计算矩阵乘积 */Q.mu = M.mu;Q.nu = N.nu;Q.tu = 0;if (M.tu*N.tu != 0) {for (arow = 1; arow <= M.mu; arow++) {memset(rpos, 0, sizeof(rpos));Q.rpos[arow] = Q.tu + 1;if (arow < M.mu)tp = M.rpos[arow + 1];elsetp = M.tu + 1;for (p = M.rpos[arow]; p < tp; p++) {brow = M.data[p].j;if (brow < N.mu)t = N.rpos[brow + 1];elset = N.tu + 1;for (q = N.rpos[brow]; q < t; q++) {ccol = N.data[q].j;rpos[ccol] += M.data[p].e*N.data[q].e;}}for (ccol = 1; ccol <= Q.nu; ccol++){if (rpos[ccol]) {Q.tu++;Q.data[Q.tu].i = arow;Q.data[Q.tu].j = ccol;Q.data[Q.tu].e = rpos[ccol];}}}}//输出乘积矩阵Qprintf("%d\n", Q.mu);printf("%d\n", Q.nu);printf("%d\n", Q.tu);for (int i = 1; i <= Q.tu; i++)printf("%d,%d,%d\n", Q.data[i].i, Q.data[i].j, Q.data[i].e);return 0;
}
十五、稀疏矩阵的乘法运算相关推荐
- 二进制空间权重矩阵_白话空间统计之二十五:空间权重矩阵(三)解构空间权重矩阵...
原标题:白话空间统计之二十五:空间权重矩阵(三)解构空间权重矩阵 中国古代就有"天圆地方"一说,所谓的"方"就是所谓的矩阵-- 在军事上面,最为讲究就是团体的力 ...
- 《算法导论3rd第十五章》动态规划
前言 和分治法一样, 动态规划 (dynamic programming)是通过组合子问题的解而解决整个问题的.分治法是将问题划分成一些独立的子问题,递归地求解各子问题,然后合并子问题的解而得到原问题 ...
- 2021年大数据HBase(十五):HBase的Bulk Load批量加载操作
全网最详细的大数据HBase文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 HBase的Bulk Load批量加载操作 一.Bulk L ...
- 2021年大数据Hadoop(二十五):YARN通俗介绍和基本架构
全网最详细的Hadoop文章系列,强烈建议收藏加关注! 后面更新文章都会列出历史文章目录,帮助大家回顾知识重点. 目录 本系列历史文章 前言 YARN通俗介绍和基本架构 Yarn通俗介绍 Yarn基本 ...
- 2021年大数据Hadoop(十五):Hadoop的联邦机制 Federation
全网最详细的Hadoop文章系列,强烈建议收藏加关注! 后面更新文章都会列出历史文章目录,帮助大家回顾知识重点. 目录 本系列历史文章 前言 Hadoop的联邦机制 Federation 背景概述 F ...
- 十五天精通WCF——第六天 你必须要了解的3种通信模式
十五天精通WCF--第六天 你必须要了解的3种通信模式 原文:十五天精通WCF--第六天 你必须要了解的3种通信模式 wcf已经说到第六天了,居然还没有说到这玩意有几种通信模式,惭愧惭愧,不过很简单啦 ...
- opengl正方形绕点旋转_一题十五种解法够不够? 旋转,构造,四点共圆乐不停...
平移,旋转,轴对称是我们初中学习的"几何三大变换".在我们初中阶段学习的几何知识中占据着核心的地位,特别是旋转,那更是核心中的核心(河南中考22题年年考). 如何更好的理解旋转,如 ...
- NeHe OpenGL第三十五课:播放AVI
NeHe OpenGL第三十五课:播放AVI 在OpenGL中播放AVI: 在OpenGL中如何播放AVI呢?利用Windows的API把每一帧作为纹理绑定到OpenGL中,虽然很慢,但它的效果不错. ...
- 转:中国互联网十五年的22个创新模式
中国互联网十五年的22个创新模式 今天,看网上有人推荐<沸腾十五年>,讲中国互联网从发源到现今. 有人有如此梳理,自己本来也想梳理一下中国互联网这么多年,到底是哪些公司出来了,为什 ...
最新文章
- 讨论:对于神经网络,不需要弄明白原理,只需要应用,是这样吗?
- android饼状图简书,Charts-饼状图
- boost::math模块使用barycentric有理插值的测试程序
- ubuntu中安装wmware-tools
- oracle删除已创建的用户,ORACLE用户创建删除
- 图的深度优先搜索(DFS)和广度优先搜索(BFS)算法
- Android性能优化2
- 长时间使用s档有危害吗_空调长时间不清洗竟有这么多危害 你知道吗?
- DES、AES、RSA等常用加密算法介绍与比较
- 服务器网站缓存占内存,服务器程序缓存占用内存
- OpenCore引导配置说明第十五版-基于OpenCore-0.6.8-04-06正式版
- Solaris 查看系统信息命令
- FTP工具FileZilla Client出现中文乱码问题解决
- html 左侧居中对齐,HTML的居中对齐
- 全志a20 开发板 linux,全志A83T开发板SDK资料,A20/A31S升级,QT5,Android5.1,Lubuntu
- 【笔记】ARM裸机程序开发_part3
- linux 屏幕录像软件,Linux系统下推荐使用的5个屏幕录像软件
- source insight 如何设置背景颜色
- 软考系统集成项目管理工程师全真模拟题
- 公务员面试题:领导干部直播带货,你怎么看?
热门文章
- 7.类的访问控制和继承
- html 子框架刷新,webpack 热更新 只对改变 CSS 有效 改变 HTML 页面会刷新 没用其他框架。...
- 无处不在的智能设备与边缘计算时代即将来临
- 数据中心运维人的半衰期危机
- java面试题在线做_java考试题目及答案也可以当面试题
- Py之matplotlib:在matplotlib库中利用legend函数创建自定义图例(代码实现)
- AI之HCI:人机交互Human-Computer Interaction的简介、发展历史、案例应用之详细攻略
- 成功解决ValueError: Input contains NaN, infinity or a value too large for dtype('float64').
- 成功解决没有tf.nn.rnn_cell属性
- JAVA_OA(十四):SSM练手项目bug-Oracle分页web页面无法转到下一页