数据结构::矩阵(一)--对称矩阵及对称矩阵的压缩存储

来源:互联网 发布:股票持仓软件 编辑:程序博客网 时间:2024/06/03 16:07

【对称矩阵】

1、定义:元素以对角线为对称轴对应相等的矩阵。

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

【对称矩阵的压缩存储】:

1、压缩存储称矩阵存储时只需要存储上三角/下三角的数据,所以最多存
n(n+1)/2个数据。
2、对称矩阵和压缩存储的对应关系:下三角存储i>=j, SymmetricMatrix[i][j] ==
Array[i*(i+1)/2+j]

**下面给出对称矩阵的实现代码**:

#include<iostream>using namespace std;template<typename T>class SymmetricMatrix{public://构造函数SymmetricMatrix(){}SymmetricMatrix(T* a, size_t n):_a(new T[n*(n+1)/2]),_n(n){size_t index = 0;for(size_t i= 0; i<_n; i++){for(size_t j = 0; j<_n; j++){if(i >= j){_a[index] = a[i*n+j];index++;}else{break;}}}}//析构函数~SymmetricMatrix(){if(_a){delete[]_a;}}//判断数组是否是访问下三角的T& Access(size_t i,size_t j){if(i <= j){std::swap(i,j);}return _a[i*(i+1)/2+j];}//打印对称矩阵void Print(){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* _a;      //用二维数组存储,用一维数组进行读取 size_t _n;   //因为是n*n的,直接给n就可以了};void Test(){int a [5][5]={{0,1,2,3,4},{1,0,1,2,3},{2,1,0,1,2},{3,2,1,0,1},{4,3,2,1,0},};SymmetricMatrix<int> sm((int*)a,5);sm.Print();}int main(){Test();return 0;}


1 0