稀疏矩阵的转置
来源:互联网 发布:美国大非农数据公布时间 编辑:程序博客网 时间:2024/06/01 08:22
稀疏矩阵:M*N的矩阵,矩阵中有效值的个数远小于无效值的个数,且这些数据的分布没有规律
如下图所示:
一般情况下,我们会想到只要交换对应的行和列,但是这种做法很浪费时间和空间,所以我们可以利用三元组进行存储,压缩存储极少数的有效数据,使用{row,col,value}三元组存储每一个有效数据,三元组按原矩阵中的位置,以行优先级先后顺序依次存放。
#define _CRT_SECURE_NO_WARNINGS 1#pragma once#include<vector>#include<iostream>using namespace std;template<class T>struct Triple //定义三元组{int _row;int _col;T _value;Triple(int row, int col, T& value):_row(row), _col(col), _value(value){}Triple():_row(0), _col(0), _value(0){}};template<class T>class SparseMatrix{public:SparseMatrix(T* a, int m, int n, const T& invalid)//invalid为非法值:_rowsize(m), _colsize(n), _invaild(invalid){for (int i = 0; i < m; ++i){for (int j = 0; j < n; j++){if (a[i*n + j] != invalid){Triple<T> tmp(i, j, a[i*n + j]);_a.push_back(tmp);}}}}SparseMatrix(size_t rowsize, size_t colsize, T invaild):_rowsize(rowsize),_colsize(colsize),_invaild(invaild){}void display(T* a, int m, int n, const T& invalid) //打印稀疏矩阵{int p = 0;for (int i = 0; i < m; ++i){for (int j = 0; j < n; j++){if (p < _a.size() && _a[p]._row == i&&_a[p]._col == j){cout << _a[p]._value << " ";p++;}else{cout << invalid << " ";}}cout << endl;}}SparseMatrix<T> Transport() //逆转矩阵{ //务必保持行优先SparseMatrix<T> sm(_colsize, _rowsize, _invaild);for (size_t i = 0; i < _colsize; i++){size_t index = 0;while (index < _a.size()){if (_a[index]._col == i){Triple<T> mm;mm._col = _a[index]._row;mm._row = _a[index]._col;mm._value = _a[index]._value;sm._a.push_back(mm);}++index;}}return sm;}SparseMatrix<T> FastTransport() //快速转置{SparseMatrix<T> temp;temp._a.resize(_a.size());int* rowcounts = new int[_col];int* rowstarts = new int[_col];memset(rowcounts, 0, sizeof((int)*_col));memset(rowstarts, 0, sizeof((int)*_col));size_t index = 0;while (index < _a.size()){rowcounts[_a[index]._col]++;++index;}rowstarts[0] = 0;for (size_t i = 0; i < _col; ++i){rowstarts[i] = rowstarts[i - 1] + rowcounts[i - 1];}while (index < _a.size()){size_t& begin = rowstarts[_a[index]._col];Triple<T> tp;tp._row = _a[index]._col;tp._col = _a[index]._row;tp._value = _a[index]._value;tmp._a[rowstarts++] = tp;++index;}delete[] _a;return tmp;} protected:size_t _rowsize;size_t _colsize;T _invaild;vector<Triple<T>> _a;};测试代码如下:void test(){int a[6][5] ={{ 1, 0, 3, 0, 5 },{ 0, 0, 0, 0, 0 },{ 0, 0, 0, 0, 0 },{ 2, 0, 4, 0, 6 },{ 0, 0, 0, 0, 0 },{ 0, 0, 0, 0, 0 }};SparseMatrix<int> d((int*)a, 6, 5, 0);SparseMatrix<int> tmp = d.Transport();cout << "转置之前:" << endl;d.display((int*)a, 6, 5, 0);cout << endl;cout << "转置之后:" << endl;tmp.display((int*)a, 5, 6, 0);}int main(){test();system("pause");return 0;}
运行结果如下:
本文出自 “零点时光” 博客,请务必保留此出处http://10741764.blog.51cto.com/10731764/1772214
0 0
- 稀疏矩阵的转置
- 稀疏矩阵的转置
- 稀疏矩阵的转置
- 稀疏矩阵的转置
- 稀疏矩阵的转置
- 稀疏矩阵的转置
- 稀疏矩阵的转置
- 稀疏矩阵的转置
- 稀疏矩阵的转置
- 稀疏矩阵的转置
- 稀疏矩阵的转置
- 稀疏矩阵的转置
- 稀疏矩阵的转置
- 稀疏矩阵的转置
- 稀疏矩阵转置
- 稀疏矩阵转置
- 稀疏矩阵转置
- 稀疏矩阵的压缩储存,稀疏矩阵的普通转置,稀疏矩阵的快速转置
- 哈希表
- 迷宫的实现
- c++统计程序运行时间的方法
- 广义表的实现
- 【虚拟现实】学习笔记
- 稀疏矩阵的转置
- irda-objs和irda-obj的差别,烧写一个字母的悲剧
- 常见的几种排序
- Vps部署ShadowScoks(ubuntu)
- linux下find命令和文件的三种时间
- android调试之top指令查看系统资源
- MySQLdb错误 编码问题 linux系统粘贴板 python取环境变量 2016.05.27回顾
- 自动备份数据库脚本
- 解决Ubuntu 14.04 Sublime_Text 中文输入的问题