~稀疏矩阵的压缩存储与转置~
2017-03-16 23:18
155 查看
众所周知,稀疏矩阵的定义如下:设一个M*N的矩阵,矩阵中有效值的个数远小于无效数的个数,且这些数据的分布没有规律时,该矩阵是稀疏矩阵。
稀疏矩阵的压缩存储存储极少的有效数据,使用三元组{row, col, value}存储每一个有效数据,三元组按原矩阵中的位置,以行优先级一次存放。
稀疏矩阵的转置,即将原矩阵的行、列对换。
详细代码如下:
测试用例如下:
值得一提的是,在进行转置的时候,需要重写SparseMatrix的构造函数;在进行快速转置的时候,需要重写SparseMatrix和Triple的构造函数,否则程序会报错,告诉你没有合适的构造函数,切记切记!!!
稀疏矩阵的压缩存储存储极少的有效数据,使用三元组{row, col, value}存储每一个有效数据,三元组按原矩阵中的位置,以行优先级一次存放。
稀疏矩阵的转置,即将原矩阵的行、列对换。
详细代码如下:
template <class T> struct Triple { size_t _row; size_t _col; T _value; Triple(size_t row, size_t col, const T& v) :_row(row) ,_col(col) ,_value(v) {} Triple() {} }; template <class T> class SparseMatrix { public: SparseMatrix(T* matrix, size_t M, size_t N, const T& invalid = T()) :_M(M) ,_N(N) ,_invalid(invalid) { for(size_t i=0; i<M; ++i) { for(size_t j=0; j<N; ++j) { if(matrix[i*N+j] != invalid) { Triple<T> t(i, j, matrix[i*N+j]); _matrix.push_back(t); } } } } SparseMatrix() {} void Display() { size_t index = 0; for(size_t i=0; i<_M; ++i) { for(size_t j=0; j<_N; ++j) { if((index<_matrix.size()) && (_matrix[index]._row==i) && (_matrix[index]._col==j)) { cout<<_matrix[index]._value<<" "; ++index; } else { cout<<_invalid<<" "; } } cout<<endl; } cout<<endl; } SparseMatrix<T> Transport() //转置 { SparseMatrix<T> sm; sm._M = _N; sm._N = _M; sm._invalid = _invalid; sm._matrix.reserve(_matrix.size()); for(size_t i=0; i<_N; ++i) { size_t index = 0; while(index < _matrix.size()) { if(_matrix[index]._col == i) { Triple<T> t(_matrix[index]); swap(t._row, t._col); sm._matrix.push_back(t); } ++index; } } return sm; } SparseMatrix<T> FastTransport() //快速转置 { SparseMatrix<T> sm; sm._M = _N; sm._N = _M; sm._invalid = _invalid; sm._matrix.resize(_matrix.size()); int *count = new int[_N]; memset(count, 0, sizeof(int)*_N); int *start = new int[_N]; //统计转置后每一行(即转置前每一列)的数据个数 size_t index = 0; while(index < _matrix.size()) { ++count[_matrix[index]._col]; ++index; } //统计转置后每一行(即转置前每一列)第一个数据的起始位置 start[0] = 0; for(size_t i=1; i<_N; ++i) { start[i] = start[i-1] + count[i-1]; } //快速定位 index = 0; while(index < _matrix.size()) { int _row = _matrix[index]._col; Triple<T> t(_matrix[index]); swap(t._row, t._col); sm._matrix[start[_row]] = t; ++start[_row]; ++index; } return sm; } protected: vector<Triple<T>> _matrix; size_t _M; size_t _N; T _invalid; };
测试用例如下:
void TestSparseMatrix() { int matric[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> sm((int *)matric, 6, 5, 0); sm.Display(); sm.Transport().Display(); sm.FastTransport().Display(); }
值得一提的是,在进行转置的时候,需要重写SparseMatrix的构造函数;在进行快速转置的时候,需要重写SparseMatrix和Triple的构造函数,否则程序会报错,告诉你没有合适的构造函数,切记切记!!!
相关文章推荐
- 稀疏矩阵的压缩存储及其两种转置算法
- 稀疏矩阵的压缩存储与转置与加法
- 稀疏矩阵的压缩存储及快速转置
- 稀疏矩阵的压缩存储和转置
- 三元组表压缩存储稀疏矩阵实现稀疏矩阵的快速转置(Java语言描述)
- 三元组表压缩存储稀疏矩阵实现稀疏矩阵的快速转置(Java语言描述)
- 矩阵的压缩存储以及转置
- 特殊矩阵的压缩存储及转置
- 矩阵:对称矩阵和稀疏矩阵的压缩存储
- 数据结构——稀疏矩阵的压缩存储
- c++稀疏矩阵的压缩存储
- 稀疏矩阵压缩存储及转置,加法运算(采用三元表)
- 数据结构 对称矩阵的压缩存储与稀疏矩阵的转置
- 稀疏矩阵的压缩存储及转置
- 5.3矩阵的压缩存储(稀疏矩阵转置和快速转置)
- 稀疏矩阵-压缩存储-列转置法- 一次定位快速转置法
- 【C++】矩阵的压缩存储,还原,转置
- 【代码】稀疏矩阵的压缩存储与转置算法
- 稀疏矩阵的压缩存储和转置
- C++实现矩阵压缩存储与(快速)转置