用三元组存储稀疏矩阵及其快速转置

  • 稀疏矩阵的三元组存储方式
  • 快速转置算法
  • 代码

稀疏矩阵的三元组存储方式

稀疏矩阵可以用一个三元组数组表示,数组每个元素是一个三元组,三元组形式为
(矩阵行号,矩阵列号,元素值)
三元组个数,即数组长度,为稀疏矩阵的非零元素个数。
三元组元素按照行号递增,列号递增的方式排序。
例如矩阵M:
[ 1 0 0 0 0 0 0 2 0 ] \begin{bmatrix} 1 & 0 & 0 \\ 0 & 0 & 0 \\ 0 & 2 & 0 \end{bmatrix} ⎣⎡​100​002​000​⎦⎤​
对应的的三元组数组为:
(0,0,1)
(2,1,2)

快速转置算法

输入:原矩阵A的三元组数组
输出:原矩阵的转置矩阵B的三元组数组

转置相当于把A的三元组数组每个元素的行列交换,然后按照列递增,行递增的顺序重排,从而算法类似于桶排序,将列相同的三元组按它们在A矩阵的三元组数组中的先后顺序放到同一个桶中,所有桶按列号从小到大排。从而需要两个大小均为矩阵A列数的数组row_size和row_start,row_size记录每个桶的大小,row_start记录每个桶下一个存进来的元素在B矩阵的三元组数组中的下标,每在桶中放入一个元素,下标自增以存放下一个元素。
例如矩阵M:
[ 1 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 3 0 0 0 0 0 4 5 0 ] \begin{bmatrix} 1 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 2 & 0 \\ 0 & 0 & 0 & 0 & 0 \\ 0 & 3 & 0 & 0 & 0 \\ 0 & 0 & 4 & 5 & 0 \end{bmatrix} ⎣⎢⎢⎢⎢⎡​10000​00030​00004​02005​00000​⎦⎥⎥⎥⎥⎤​
对应的三元组数组变为其转置矩阵的三元组数组:

row_size数组为{1,1,1,2,0},初始的row_start数组为{0,1,2,3,5}
列数相同则颜色相同,一个颜色即为一个“桶”,也就是转置矩阵一行的所有非零元素,将每种颜色按列号从小到大排序,由于在原数组中就是按行号递增的顺序存放,所以同种颜色的三元组顺序保持不变。

预先定义两个数组row_size, row_start分别存储B每行的非零元素个数和当前
非零元素在三元组数组中的下标,row_size数组所有元素初始化为0
elements_A: A的三元组数组
elements_B: B的三元组数组
col_num: A的列数,B的行数,也是桶的个数
// 统计每个桶的大小,即B每行非零元素个数
1、对elements_A中每个元素triple:row_size[triple.col]++
// 计算B每行非零元素在elements_B中的初始下标
2、对row_start数组中的第i(i从1到col_num-1)个元素:row_start[i] = row[start[i-1] + row_size[i-1]
// 遍历elements_A,将其放入elements_B中对应的桶中
3、对elements_A中的每个元素triple:// B中对应三元组就是把triple的行号列号交换,值不变elements_B[row_start[triple.col]].col = triple.row elements_B[row_start[triple.col]].row = triple.colelements_B[row_start[triple.col]].value = triple.value// 桶中下一元素的下标row_start[triple.col]++

代码

实现代码在这里的sparse_matrix_transpose.cpp,其中头文件是myheaders文件夹中的sparse_matrix.transpose.h

用三元组存储稀疏矩阵及其快速转置相关推荐

  1. 用三元组存储稀疏矩阵并实现转置

    基本概念 在学习线性代数的时候,经常用到矩阵.在C语言中,表示矩阵的最直观形式就是二维数组.然而在实际应用中,很多高阶矩阵中的非零元素非常少,这个时候如果继续使用二维数组存储,那么就会浪费很多存储空间 ...

  2. 【LB】稀疏矩阵的快速转置原理及其算法

    关于稀疏矩阵的快速转置法,首先得明白其是通过对三元表进行转置.如果误以为是对矩阵进行转置,毫无疑问就算你想破脑袋也想不出个所以然,别陷入死胡同了! 对于一个三元表,行为i,列为j,值为v.需将其i与j ...

  3. 用三元组存储稀疏矩阵,实现其快速转置c语言代码,稀疏矩阵三元组表快速转置(C语言实现)...

    本来准备昨天下午写的,但是因为去参加360众测靶场的考核耽搁了,靶场的题目还是挺基础的. 继续学习吧. 使用黑色墨水在白纸上签名就像由像素点构成的稀疏矩阵.如图4所示. 图4手写体签名 [问题]请将以 ...

  4. 稀疏矩阵转置 java代码_三元组稀疏矩阵的快速转置

    小问题却整了这么久,能力有待加强,要强烈区分三元组的列数与元素总数, 不能将他俩写混了 #include #define MAXSIZE 1250 #define OK 1 #define ERROR ...

  5. 稀疏矩阵的快速转置(C语言版)

    #include <stdio.h> #include <stdlib.h> #define MAX 100 typedef struct node{     int i,j, ...

  6. java三元组的快速转置_稀疏矩阵三元组快速转置(转poklau123写的很清楚)

    关于稀疏矩阵的快速转置法,首先得明白其是通过对三元表进行转置.如果误以为是对矩阵进行转置,毫无疑问就算你想破脑袋也想不出个所以然,别陷入死胡同了! 对于一个三元表,行为i,列为j,值为v.需将其i与j ...

  7. 十四、矩阵的快速转置算法

    十四.矩阵的快速转置算法 文章目录 十四.矩阵的快速转置算法 题目描述 解题思路 上机代码 题目描述 数据压缩是提高传输.存储效率一种技术.教材第5章介绍了两种简单的压缩存储方法.本实验要求实现三元组 ...

  8. 稀疏矩阵的三元组存储及快速转置

    问题描述 [问题描述] 实现稀疏矩阵的三元组表存储和快速转置运算. [输入形式] 输入一个整型的6阶稀疏矩阵. [输出形式] 输出稀疏矩阵的三元组表形式,使用快速转置方法进行转置运算,输出辅助数组nu ...

  9. 5.3矩阵的压缩存储(稀疏矩阵转置和快速转置)

    在矩阵中有许多值相同的元素或者是零元素.有时为了节省存储空间,可以对这类矩阵进行压缩存储.所谓的压缩存储是指:为多个值相同的元值分配一个存储空间:对零元不分配空间. 5.32稀疏矩阵 在m*n的矩阵中 ...

最新文章

  1. 创业基础(第四章: 创业风险及识别与管理) 来自高校:全国大学生创新创业实践联盟 分类:创新创业 学习规则:按序学习
  2. ME21N增强提示警告消息
  3. OpenCV直方图计算Histogram Calculation
  4. 我的第一个.NET Core App Windows系统
  5. 某瓜数据之sign参数分析
  6. tomcat项目的ajax路径问题,Tomcat下ajax请求路径总结
  7. Install OpenCV-Python in Ubuntu
  8. MySql 内连接,外连接查询方式区别
  9. java中calendarr,Java学习(16)--System 类/Date 类/ Calendar类
  10. python文件,字符串,二进制的读写
  11. FFmpeg下载编译好的WINDOWS库头文件
  12. python小游戏——散刺修罗场
  13. 编写测试用例方法之错误推测法
  14. win10忘记密码,重装系统
  15. 2022-2027年中国化纤行业市场调研及未来发展趋势预测报告
  16. 伦敦大学学院计算机硕士专业介绍,2020年伦敦大学学院计算机科学专业硕士申请条件-学费-世界排名...
  17. ts 的class和interface的区别
  18. Java语言学习第一周周报
  19. [SDM660 Android9.0]音频模块:xs2002的使能与调试
  20. 基于proteus软件仿真AT89C52的双机串口通信 附工程包

热门文章

  1. oauth2.0+jwt资源服务器配置
  2. 杭州dell戴尔服务器维修点,【浙江dell杭州服务中心】报价_杭州戴尔维修中心
  3. 斐讯R1音箱终于复活了!
  4. 生成HTML报告时,报错:AttributeError: type object ‘_io.StringIO‘ has no attribute ‘StringIO‘
  5. 北京理工大学计算机实验四报告表,北京理工大学数据结构实验报告实验四
  6. 虚拟机的网络设置与wifi网络的连接
  7. win10误删微软商店,重新安装微软商店的方法
  8. 编写一个程序,实现设置上月、本月电表读数,显示上月、本月电表读数,计算并显示本月用电数。
  9. 同步听 一款捕获电脑声音到手机播放
  10. 数学实验课MATLAB实验报告一(题目+代码)