时间:2021-05-20
对称矩阵及稀疏矩阵的压缩存储
1.稀疏矩阵
对于那些零元素数目远远多于非零元素数目,并且非零元素的分布没有规律的矩阵称为稀疏矩阵(sparse)。
人们无法给出稀疏矩阵的确切定义,一般都只是凭个人的直觉来理解这个概念,即矩阵中非零元素的个数远远小于矩阵元素的总数,并且非零元素没有分布规律。
实现代码:
//稀疏矩阵及其压缩存储 #pragma once #include <vector> #include <iostream> using namespace std; template<class T> struct Triple { size_t _r; size_t _c; T _value; Triple(size_t row = 0, size_t col = 0, const T& value = T()) :_r(row) ,_c(col) ,_value(value) {} }; template <class T> class SparseMatrix { public: SparseMatrix() :_row(0) ,_col(0) ,_illegal(T()) {} SparseMatrix(T* arr, size_t row, size_t col, const T& illegal) :_row(row) ,_col(col) ,_illegal(illegal) { for(size_t i = 0; i<row; ++i) { for(size_t j = 0; j<col; ++j) { if(arr[i*col+j] != illegal) { Triple<T> t(i,j,arr[i*col+j]); _matrix.push_back(t); } } } } void Display() { vector<Triple<T> >::iterator iter; iter = _matrix.begin(); for(size_t i = 0; i<_row; ++i) { for(size_t j = 0; j<_col; ++j) { if(iter!=_matrix.end() &&iter->_r == i &&iter->_c == j) { cout << iter->_value <<" "; ++iter; } else { cout << _illegal <<" "; } } cout << endl; } cout << endl; } //普通转置(行优先存储) //列变行,从0列开始,将列数据一个一个放进转置矩阵 SparseMatrix<T> Transpose() { SparseMatrix<T> tm; tm._row = _col; tm._col = _row; tm._illegal = _illegal; tm._matrix.reserve(_matrix.size()); for(size_t i = 0; i<_col; ++i) { size_t index = 0; while(index < _matrix.size()) { if(_matrix[index]._c == i) { Triple<T> t(_matrix[index]._c, _matrix[index]._r, _matrix[index]._value); tm._matrix.push_back(t); } ++index; } } return tm; } SparseMatrix<T> FastTranspose() { SparseMatrix<T> tm; tm._row = _col; tm._col = _row; tm._illegal = _illegal; tm._matrix.resize(_matrix.size()); int* count = new int[_col];//记录每行的元素个数 memset(count, 0, sizeof(int)*_col); int* start = new int[_col];//转置矩阵中元素的位置 start[0] = 0; size_t index = 0; while(index < _matrix.size()) { count[_matrix[index]._c]++; ++index; } for(size_t i=1; i<_col; ++i) { start[i] = start[i-1] + count[i-1]; } index = 0; while(index < _matrix.size()) { Triple<T> t(_matrix[index]._c, _matrix[index]._r, _matrix[index]._value); tm._matrix[start[_matrix[index]._c]++] = t; //核心代码 ++index; } delete[] count; delete[] start; return tm; } protected: vector<Triple<T> > _matrix; size_t _row; size_t _col; T _illegal; };2.对称矩阵
实现代码:
//对称矩阵及其压缩存储 #pragma once #include <iostream> using namespace std; template <class T> class SymmetricMatrix { public: SymmetricMatrix(T* arr, size_t n) :_n(n) ,_matrix(new T[n*(n+1)/2]) { size_t index = 0; for(size_t i = 0; i<n; ++i) { for(size_t j=0; j<n;++j) { if(i >= j) { _matrix[index] = arr[i*n+j]; ++index; } else { continue; } } } } void Display() { for(size_t i =0; i < _n; ++i) { for(size_t j = 0; j < _n; ++j) { /* if(i<j) { swap(i,j); cout<<_matrix[i*(i+1)/2+j]<<" "; swap(i,j); } else cout<<_matrix[i*(i+1)/2+j]<<" "; */ cout << Access(i,j) << " "; } cout << endl; } cout << endl; } T& Access(size_t row, size_t col) { if(row<col) { swap(row, col); } return _matrix[row*(row+1)/2+col]; } ~SymmetricMatrix() { if(_matrix != NULL) { delete[] _matrix; _matrix = NULL; } } protected: T* _matrix; size_t _n; //对称矩阵的行列大小 };以上就是C++ 数据结构实现稀疏矩阵与对称矩阵,如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
C++实现稀疏矩阵的压缩存储的实例稀疏矩阵:M*N的矩阵,矩阵中有效值的个数远小于无效值的个数,且这些数据的分布没有规律。稀疏矩阵的压缩存储:压缩存储值存储极少
什么是稀疏矩阵呢,就是在M*N的矩阵中,有效值的个数远小于无效值的个数,并且这些数据的分布没有规律。在压缩存储稀疏矩阵的时候我们只存储极少数的有效数据。我们在这
工程实践中,多数情况下,大矩阵一般都为稀疏矩阵,所以如何处理稀疏矩阵在实际中就非常重要。本文以Python里中的实现为例,首先来探讨一下稀疏矩阵是如何存储表示的
首先简单说一下什么是行压缩图,其实严格意义上应该是行压缩矩阵。正常情况下,矩阵是用二维数组简单存储的,但是如果是稀疏矩阵,也就是零很多的时候,这样比较浪费空间。
本文实例讲述了C#判断一个矩阵是否为对称矩阵及反称矩阵的方法。分享给大家供大家参考。具体如下:1.判断对称矩阵对任意i和j,有a[i,j]=a[j,i]////