对称矩阵,相信大家都有所了解,即元素为以主对角线为对称轴对应相等的矩阵。故而会有许多相等的元素。
这种矩阵如果很大,存储时必然会浪费很多空间,本文讲解对称矩阵的压缩存储。
以如下4*4对称矩阵为例:
template<class T>
class SymmetricMatrix
{
public:
SymmetricMatrix()
: _a(NULL), _n(0)
{}
SymmetricMatrix(T* a, size_t n)
: _a(new T[(n*(n + 1)) >> 1])//此处用前n项和公式求矩阵压缩后所需空间大小
, _n(0)
{
for (size_t i = 0; i < n; ++i)
{
for (size_t j = 0; j <= i; ++j)
_a[_n++] = a[i*n + j];
}
_n = n;
}
SymmetricMatrix(const SymmetricMatrix& matrix)
:_a(new T[(matrix._n * (matrix._n + 1)) >> 1])
, _n(matrix._n)
{
for (size_t i = 0; i < ((_n*(_n + 1)) >> 1); ++i)
_a[i] = matrix._a[i];
}
SymmetricMatrix& operator=(SymmetricMatrix matrix)
{
swap(_a, matrix._a);
swap(_n, matrix._n);
return *this;
}
~SymmetricMatrix()
{
delete[] _a;
_a = NULL;
}
public:
void Print()
{
for (size_t i = 0; i < _n; ++i)
{
for (size_t j = 0; j < _n; ++j)
{
if (i >= j)// 此时ij标志下三角元素
cout << Get(i, j) << " ";
else // 此时ij标志上三角元素,需交换获取值
cout << Get(j, i) << " ";
}
cout << endl;
}
}
T& Get(size_t i, size_t j)
{
return _a[(i*(i + 1) >> 1) + j];
}
protected:
T* _a;
size_t _n;
};
本博文若有何错误不足之处,欢迎大家一起交流或批评指正!
喜欢的朋友请点赞噢n(≧▽≦)n!!
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- fupindai.com 版权所有 赣ICP备2024042792号-2
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务