十五、稀疏矩阵的乘法运算

文章目录

  • 十五、稀疏矩阵的乘法运算
    • 题目描述
    • 解题思路
    • 上机代码

题目描述

数据压缩是提高传输、存储效率一种技术。教材第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;
}

十五、稀疏矩阵的乘法运算相关推荐

  1. 二进制空间权重矩阵_白话空间统计之二十五:空间权重矩阵(三)解构空间权重矩阵...

    原标题:白话空间统计之二十五:空间权重矩阵(三)解构空间权重矩阵 中国古代就有"天圆地方"一说,所谓的"方"就是所谓的矩阵-- 在军事上面,最为讲究就是团体的力 ...

  2. 《算法导论3rd第十五章》动态规划

    前言 和分治法一样, 动态规划 (dynamic programming)是通过组合子问题的解而解决整个问题的.分治法是将问题划分成一些独立的子问题,递归地求解各子问题,然后合并子问题的解而得到原问题 ...

  3. 2021年大数据HBase(十五):HBase的Bulk Load批量加载操作

    全网最详细的大数据HBase文章系列,强烈建议收藏加关注! 新文章都已经列出历史文章目录,帮助大家回顾前面的知识重点. 目录 系列历史文章 HBase的Bulk Load批量加载操作 一.Bulk L ...

  4. 2021年大数据Hadoop(二十五):YARN通俗介绍和基本架构

    全网最详细的Hadoop文章系列,强烈建议收藏加关注! 后面更新文章都会列出历史文章目录,帮助大家回顾知识重点. 目录 本系列历史文章 前言 YARN通俗介绍和基本架构 Yarn通俗介绍 Yarn基本 ...

  5. 2021年大数据Hadoop(十五):Hadoop的联邦机制 Federation

    全网最详细的Hadoop文章系列,强烈建议收藏加关注! 后面更新文章都会列出历史文章目录,帮助大家回顾知识重点. 目录 本系列历史文章 前言 Hadoop的联邦机制 Federation 背景概述 F ...

  6. 十五天精通WCF——第六天 你必须要了解的3种通信模式

    十五天精通WCF--第六天 你必须要了解的3种通信模式 原文:十五天精通WCF--第六天 你必须要了解的3种通信模式 wcf已经说到第六天了,居然还没有说到这玩意有几种通信模式,惭愧惭愧,不过很简单啦 ...

  7. opengl正方形绕点旋转_一题十五种解法够不够? 旋转,构造,四点共圆乐不停...

    平移,旋转,轴对称是我们初中学习的"几何三大变换".在我们初中阶段学习的几何知识中占据着核心的地位,特别是旋转,那更是核心中的核心(河南中考22题年年考). 如何更好的理解旋转,如 ...

  8. NeHe OpenGL第三十五课:播放AVI

    NeHe OpenGL第三十五课:播放AVI 在OpenGL中播放AVI: 在OpenGL中如何播放AVI呢?利用Windows的API把每一帧作为纹理绑定到OpenGL中,虽然很慢,但它的效果不错. ...

  9. 转:中国互联网十五年的22个创新模式

    中国互联网十五年的22个创新模式     今天,看网上有人推荐<沸腾十五年>,讲中国互联网从发源到现今. 有人有如此梳理,自己本来也想梳理一下中国互联网这么多年,到底是哪些公司出来了,为什 ...

最新文章

  1. 讨论:对于神经网络,不需要弄明白原理,只需要应用,是这样吗?
  2. android饼状图简书,Charts-饼状图
  3. boost::math模块使用barycentric有理插值的测试程序
  4. ubuntu中安装wmware-tools
  5. oracle删除已创建的用户,ORACLE用户创建删除
  6. 图的深度优先搜索(DFS)和广度优先搜索(BFS)算法
  7. Android性能优化2
  8. 长时间使用s档有危害吗_空调长时间不清洗竟有这么多危害 你知道吗?
  9. DES、AES、RSA等常用加密算法介绍与比较
  10. 服务器网站缓存占内存,服务器程序缓存占用内存
  11. OpenCore引导配置说明第十五版-基于OpenCore-0.6.8-04-06正式版
  12. Solaris 查看系统信息命令
  13. FTP工具FileZilla Client出现中文乱码问题解决
  14. html 左侧居中对齐,HTML的居中对齐
  15. 全志a20 开发板 linux,全志A83T开发板SDK资料,A20/A31S升级,QT5,Android5.1,Lubuntu
  16. 【笔记】ARM裸机程序开发_part3
  17. linux 屏幕录像软件,Linux系统下推荐使用的5个屏幕录像软件
  18. source insight 如何设置背景颜色
  19. 软考系统集成项目管理工程师全真模拟题
  20. 公务员面试题:领导干部直播带货,你怎么看?

热门文章

  1. 7.类的访问控制和继承
  2. html 子框架刷新,webpack 热更新 只对改变 CSS 有效 改变 HTML 页面会刷新 没用其他框架。...
  3. 无处不在的智能设备与边缘计算时代即将来临
  4. 数据中心运维人的半衰期危机
  5. java面试题在线做_java考试题目及答案也可以当面试题
  6. Py之matplotlib:在matplotlib库中利用legend函数创建自定义图例(代码实现)
  7. AI之HCI:人机交互Human-Computer Interaction的简介、发展历史、案例应用之详细攻略
  8. 成功解决ValueError: Input contains NaN, infinity or a value too large for dtype('float64').
  9. 成功解决没有tf.nn.rnn_cell属性
  10. JAVA_OA(十四):SSM练手项目bug-Oracle分页web页面无法转到下一页