对称矩阵的压缩存储

来源:互联网 发布:程序员的思维修炼 txt 编辑:程序博客网 时间:2024/05/21 15:10

对称矩阵是一个N*N的方阵A,A中任意元素Aij,当且仅当Aij == Aji(0 <= i <= N-1&& 0 <= j <= N-1),则矩阵A是对称矩阵。以矩阵的对角线为分隔,分为上三角和下三角。


压缩存储称矩阵存储时只需要存储上三角/下三角的数据,所以最多存储n(n+1)/2个数据。

对称矩阵和压缩存储的对应关系:下三角存储i>=j,SymmetricMatrix[i][j] ==Array[i*(i+1)/2+j] ;


读取时,由于上三角上的数据与下三角存在Aij  = Aji,则只需要将i与j的值互换便能通过下三角数据读取到上三角数据。

代码实现如下:

template<class T>class SymmetricMatrix   //对称矩阵的下三角存储{public:SymmetricMatrix(T* arr, size_t n)  //构造函数{_n = n;_arr = new T[n*(n+1)/2];for (size_t i = 0; i < n; i++){for (size_t j = 0; j < n; j++){if (i >= j)_arr[i*(i + 1) / 2 + j] = arr[i*n + j];elsebreak;}}}~SymmetricMatrix()  //析构函数{delete[] _arr;_arr = NULL;_n = 0;}T& Access(size_t i, size_t j){if (i < j){swap(i, j);}return _arr[i*(i + 1) / 2 + j];}void Display()    //打印完整矩阵{for (size_t i = 0; i < _n; i++){for (size_t j = 0; j < _n; j++){cout << Access(i, j) << " ";}cout << endl;}cout << endl;}protected:T* _arr;size_t _n;//矩阵大小 };



2 1
原创粉丝点击