稀疏矩阵:矩阵中大多数元素为0的矩阵(本文以行序为主序)

稀疏矩阵的三元组表述法:

类型结构:

template <typename T>
struct Triple
{int _row;int _col;T _value;
};template <typename T>
class SparseMatrix
{
public:SparseMatrix<T>::SparseMatrix();SparseMatrix(const T* array, size_t row, size_t col, const T& invalid);~SparseMatrix();void Display()const;SparseMatrix<T> Transport()const;SparseMatrix<T> FastTransport()const;
protected:vector<Triple<T>> _array;size_t _rowCount;size_t _colCount;T _invalid;
};

代码实现压缩存储:

//稀疏矩阵
template <typename T>
SparseMatrix<T>::SparseMatrix(){}
template <typename T>
SparseMatrix<T>::SparseMatrix(const T* array, size_t row, size_t col, const T& invalid)
:_rowCount(row), _colCount(col), _invalid(invalid)
{assert(array);for (size_t i = 0; i < row; ++i){for (size_t j = 0; j < col; ++j){if (array[i*col + j] != invalid){this->_array.push_back({ i, j, array[i*col + j] });}}}
}
template <typename T>
SparseMatrix<T>::~SparseMatrix()
{}
template <typename T>
void SparseMatrix<T>::Display()const
{size_t size = this->_array.size();size_t iCount = 0;for (size_t i = 0; i < this->_rowCount; ++i){for (size_t j = 0; j < this->_colCount; ++j){if (iCount < size && i == this->_array[iCount]._row && j == this->_array[iCount]._col){cout << this->_array[iCount]._value << " ";++iCount;}else{cout << this->_invalid << " ";}}cout << endl;}
}

稀疏矩阵的转置:

1)列序递增转置法:找出第i行全部元素:从头到尾扫描三元组表A,找出其中所有_col==i的三元组,转置后放入三元组表B中。代码实现如下:

template <typename T>
SparseMatrix<T> SparseMatrix<T>::Transport()const
{SparseMatrix<T> ret;ret._rowCount = this->_colCount;ret._colCount = this->_rowCount;ret._invalid = this->_invalid;size_t size = this->_array.size();for (size_t col = 0; col < this->_colCount; ++col){for (size_t iCount = 0; iCount < size; ++iCount){if (this->_array[iCount]._col == col){ret._array.push_back({ this->_array[iCount]._col, this->_array[iCount]._row, this->_array[iCount]._value });}}}return ret;
}

2)一次定位快速转置法

在方法1中为了使转置后矩阵的三元组表B仍按行序递增存放,必须多次扫描被转置的矩阵的三元组表A。为了能将被转置三元组表A的元素一次定位到三元组B的正确位置上,需要预先计算以下数据:

i)待转置矩阵三元组表A每一列中非0元素的总个数,即转置后矩阵三元组元素B的每一行的非0元素总个数

ii)待转置矩阵每一列中第一个非0元素在三元组表B中的正确位置,即转置后矩阵每一行中第一个非0元素在三元组B中的正确位置

为此,需要设两个数组分别为num[] 和 pos[] ,其中num[col]用来存放三元组表A第col列中非0元素元素总个数,pos[col]用来存放转置前三元组表A中第col列中第一个非0元素在三元组表B中的存储位置。

num[col]的计算方法:将三元组表A扫描一遍,对于其中列号为col的元素,给相应的num数组中下标为col的元素加1.

pos[col]的计算方法:

i)pos[0] = 0,表示三元组表A中,列值为0的第一个非0元素在三元组表B中的下标值。

ii)pos[col] = pos[col - 1] + num[col - 1],其中1<=col<A.size();

eg:

0  1  9  0  0  0  0

0  0  0  0  0  0  0

3  0  0  0  0  4  0

0  0  2  0  0  0  0

0  8  0  0  0  0  0

5  0  0  7  0  0  0

col 0 1 2 3 4 5 6
num[col] 2 2 2 1 0 1 0
pos[col] 0 2 4 6 7 7 8

代码实现:

template <typename T>
SparseMatrix<T> SparseMatrix<T>::Transport()const
{SparseMatrix<T> ret;ret._rowCount = this->_colCount;ret._colCount = this->_rowCount;ret._invalid = this->_invalid;size_t size = this->_array.size();for (size_t col = 0; col < this->_colCount; ++col){for (size_t iCount = 0; iCount < size; ++iCount){if (this->_array[iCount]._col == col){ret._array.push_back({ this->_array[iCount]._col, this->_array[iCount]._row, this->_array[iCount]._value });}}}return ret;
}
template <typename T>
SparseMatrix<T> SparseMatrix<T>::FastTransport()const
{SparseMatrix<T> ret;ret._rowCount = this->_colCount;ret._colCount = this->_rowCount;ret._invalid = this->_invalid;size_t size = this->_array.size(); ret._array.resize(size);vector<int> num(this->_colCount);vector<int> pos(this->_colCount); //pos[i] = pos[i-1]+num[i-1] i>0for (size_t i = 0; i < size; ++i){++num[this->_array[i]._col];}for (size_t col = 1; col < this->_colCount; ++col){pos[col] = pos[col - 1] + num[col - 1];}for (size_t i = 0; i < size; ++i){ret._array[pos[this->_array[i]._col]++] = { this->_array[i]._col, this->_array[i]._row, this->_array[i]._value };}return ret;
}

运行结果:

转载于:https://blog.51cto.com/10740026/1762795

稀疏矩阵的压缩存储与转置相关推荐

  1. c++矩阵转置_C语言:数据结构-稀疏矩阵的压缩存储

    (1)稀疏矩阵的特点 在一个m×n的矩阵中,设矩阵中有i个元素不为零,并令△=i/(m×n),称△为稀疏因子.通常当△≤0.05时.认为该矩阵为稀疏矩阵. 对这类矩阵实现压缩存储的基本思路是只需要存储 ...

  2. 利用三元组对稀疏矩阵进行压缩存储并实现矩阵的转置运算

    我们假设在m*n的矩阵中,有t个元素不为0,令a=t/(m*n),称a为矩阵的稀疏因子,通常认为a<=0.05时称为稀疏矩阵. 为了节省存储空间,我们对稀疏矩阵进行压缩存储--只存储稀疏矩阵的非 ...

  3. 稀疏矩阵的压缩存储--十字链表(转载)

    稀疏矩阵的压缩存储--十字链表(转载)<?xml version="1.0" encoding="UTF-8"?> 来自为知笔记(Wiz) 转载于: ...

  4. 如何用三元组表表示下列稀疏矩阵_稀疏矩阵的压缩存储可以用一个三元组表来表示稀疏矩阵中的非0元素。...

    问题:稀疏矩阵的压缩存储可以用一个三元组表来表示稀疏矩阵中的非0元素. 答案:对 更多相关问题 (本小题满分10分)已知抛物线的焦点坐标是F(0,-2), 求它的标准方程. I bought a dr ...

  5. 稀疏矩阵的压缩存储与操作(实测程序)

    第1关:基于三元表顺序存储的稀疏矩阵的转置与输出(测试) 任务描述 本关任务:写一个程序,使用三元组顺序表存储一个稀疏矩阵,然后求出其转置矩阵并输出. 相关知识 为了完成本关任务,你需要掌握: 1.三 ...

  6. 稀疏矩阵的压缩存储的两种策略

    来自王道数据结构

  7. 矩阵的压缩存储(随机稀疏矩阵的建立和输出)

    实际应用中会有很多利用高阶矩阵的问题,有的高阶矩阵已达到几十万阶,几千亿个元素.然而,多数的高阶矩阵中包含了大量的数值为零的元素,需要对这类矩阵进行压缩存储.因为合理的压缩存储不仅能有效地节省存储空间 ...

  8. 特殊矩阵的压缩存储(对称矩阵,三角矩阵,对角矩阵,稀疏矩阵的顺序,链序存储,十字链表的建立)

    特殊矩阵的压缩存储 压缩存储的定义: 若多个数据元素的值都相同,则只分配一个元素值的存储空间,且 零元素不占存储空间. 能够压缩的一些矩阵: 一些特殊矩阵,如:对称矩阵,对角矩阵,三角矩阵,稀疏矩阵等 ...

  9. 特殊矩阵的压缩存储(详细版 通俗易懂 含c语言稀疏矩阵十字链表代码 )

    前言 此文章是本人第一篇博客,目的在于巩固过去所学的知识,同时可能会给大家带来一丝丝帮助,但由于没有经验加上本人能力极其有限,文章中可能存在不足之处,还请读者能够指正(`・ω・´). 这篇文章首先会介 ...

最新文章

  1. 由粗到精学习LVI-SAM:论文原文解析
  2. c++读取json文件_SPARK入门 - json文件读取
  3. ACM新手之八大输入输出格式
  4. 数组排序c语言函数_C语言如何写出返回数组最大最小值之差的函数(C primer plus 10-5)...
  5. word-wrap: break-word; break-word: break-all;区别
  6. 原生ajax如何执行,原生ajax调用数据实例讲解
  7. 期刊论文格式模板 电子版_期刊论文的框架结构
  8. Jmeter参数化的理解
  9. linux raw格式改名img,4款Linux下的RAW格式图片编辑软件
  10. leetcode python3 简单题190. Reverse Bits
  11. 拖拽图片到另一个div里
  12. 计算机毕业生学士服,特殊毕业季,这些“别人家的高校”为毕业生送上定制版学士服...
  13. JAVA声明圆锥体类,实现Area和Volume接口,计算表面积和体积,按体积比较大小
  14. linux设置usb选择性暂停,usb大容量存储设备是什么?无法启动怎么解决?
  15. 看虚幻引擎技术大神分享烧脑干货《克服VR眩晕之帧数:提升UE4内容实时渲染效率》(备忘)
  16. https://www.i5seo.com/
  17. TQuery.RecordCount有时不灵呀
  18. SecureCRT连接交换机Console口
  19. Automatic Panoramic Image Stitching using Invariant Features笔记
  20. 大道至简:透过现象看本质

热门文章

  1. 【Android UI设计与开发】第08期:底部菜单栏(三)Fragment+FragmentTabHost实现仿新浪微博底部菜单栏
  2. 【Android UI设计与开发】第02期:引导界面(二)使用ViewPager实现欢迎引导页面
  3. ThreadLocal的使用及原理分析
  4. 将课程中的所有动手动脑的问题以及课后实验性的问题,整理成一篇文档,以博客形式发表在博客园...
  5. 【逆向工具】IDA使用5-( string、图形化与视图的切换、图形化显示反汇编地址、自动注释、标签使用)...
  6. Linux 服务器安全技巧
  7. 一个超牛的东东:专门删除牛皮文件和文件夹
  8. 虚拟机内 docker启动 局域网无发访问 问题解决
  9. Vue、React打包文件放在服务器,浏览器存在缓存问题的解决
  10. Windows10 家庭版没有本地组策略解决方法