众所周知,对称矩阵的定义如下:设一个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();
}