c++对称矩阵的压缩存储
对称矩阵
对称矩阵及对称矩阵的压缩存储
设一个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
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。