~对称矩阵的压缩存储~

来源:互联网 发布:2017java面试题 编辑:程序博客网 时间:2024/05/21 13:54

       众所周知,对称矩阵的定义如下:设一个N*N的方阵A,A中任意元素Aij,当且仅当Aijj==Aji(0<=i<N,0<=j<N)时,该矩阵是对称矩阵。以对称矩阵的对角线为分割,分为上三角形和下三角形。

       压缩存储对称矩阵时只需存储上三角形或下三角形的数据即可,故最多可存储n(n+1)/2个数据。

以下代码是以对称矩阵的下三角形存储:

template <class T>class SymmetricMatrix{public:SymmetricMatrix(T* matrix, 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++] = matrix[i*N+j];}else{break;}}//for(size_t j=0; j<=i; ++j)//{//_matrix[index++] = matrix[i*N+j];//}}}~SymmetricMatrix(){delete[] _matrix;_matrix = NULL;_N = 0;}T& Access(size_t i, size_t j)  //判断位置{if(i < j){swap(i, j);}return _matrix[i*(i+1)/2+j];}const T& Access(size_t i, size_t j) const  //判断位置{if(i < j){swap(i, j);}return _matrix[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* _matrix;size_t _N;};

测试用例如下:

void TestSymmetricMatrix(){int matric[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 *)matric, 5); sm.Display();}



 

 

0 0
原创粉丝点击