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

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

Symmetry.h中template<classT>classSymmetry{public://构造函数Symmetry(T*arr,size_tsize):_arr(newT[size*(size+1)/2]),_size(size*(size+1)/2){for(inti=0;i<size;i++){for(intj=0;j<size;j++){if(i>=j){_arr[i*(i+1)/2+j]=arr[i*size+j];//把对称矩阵压缩}}}}//打印voidPrint(size_tsize){for(inti=0;i<size;i++){for(intj=0;j<size;j++){introw=i;intcol=j;if(row<col){swap(row,col);}cout<<_arr[row*(row+1)/2+col]<<"";}cout<<endl;}cout<<endl;}protected:T*_arr;size_t_size;};test.cpp中#include<iostream>usingnamespacestd;#include"Symmetry.h"voidTest(){intarr[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}};Symmetry<int>s((int*)arr,5);s.Print(5);}intmain(){Test();system("pause");return0;}