对称矩阵

对称矩阵及对称矩阵的压缩存储

设一个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]

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},};

程序代码:

#pragmaoncetemplate<classT>classSymmetricMatrix{public://初始化与声明顺序保持一致SymmetricMatrix(constT*a,size_tN)//二维数组改成一维数组用传参:_a(newT[N*(N+1)/2]),_n(N){size_tindex=0;for(size_ti=0;i<N;++i){for(size_tj=0;j<N;++j){if(i>=j)//上三角{_a[index++]=a[i*N+j];}else//否则下三角{break;//break之后执行次数少}}}}voidDisplay()//展示{for(size_ti=0;i<_n;++i){for(size_tj=0;j<_n;++j){if(i>=j){cout<<_a[i*(i+1)/2+j]<<"";}else{cout<<_a[j*(j+1)/2+i]<<"";}}cout<<endl;}cout<<endl;}T&Access(size_ti.size_tj){if(i<j)//上三角swap(i,j);//交换成下三角return_a[i*(i+1)/2+j];}protected:T*_a;//一维数组对称轴也要存size_t_n;//只是声明并没有定义};voidTest1(){inta[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.Display();//类压缩存储}#include<iostream>usingnamespacestd;#include<stdlib.h>#include"Matrix.h"intmain(){Test1();system("pause");return0;}


运行结果:

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