对称矩阵是一个N*N的方阵A,A中任意元素Aij,当且仅当Aij == Aji(0 <= i <= N-1&& 0 <= j <= N-1),则矩阵A是对称矩阵。以矩阵的对角线为分隔,分为上三角和下三角。
对称矩阵和压缩存储的对应关系:下三角存储i>=j, SymmetricMatrix[i][j] ==Array[i*(i+1)/2+j] ;
读取时,由于上三角上的数据与下三角存在Aij = Aji,则只需要将i与j的值互换便能通过下三角数据读取到上三角数据。
代码实现如下:
template<class T>
class SymmetricMatrix //对称矩阵的下三角存储
{
public:
SymmetricMatrix(T* arr, size_t n) //构造函数
{
_n = n;
_arr = new T[n*(n+1)/2];
for (size_t i = 0; i < n; i++)
{
for (size_t j = 0; j < n; j++)
{
if (i >= j)
_arr[i*(i + 1) / 2 + j] = arr[i*n + j];
else
break;
}
}
}
~SymmetricMatrix() //析构函数
{
delete[] _arr;
_arr = NULL;
_n = 0;
}
T& Access(size_t i, size_t j)
{
if (i < j)
{
swap(i, j);
}
return _arr[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* _arr;
size_t _n;//矩阵大小
};