对称矩阵的压缩存储
来源:互联网 发布:win7如何设置网络共享 编辑:程序博客网 时间:2024/04/30 06:51
对称矩阵,相信大家都有所了解,即元素为以主对角线为对称轴对应相等的矩阵。故而会有许多相等的元素。
这种矩阵如果很大,存储时必然会浪费很多空间,本文讲解对称矩阵的压缩存储。
以如下4*4对称矩阵为例:
本文考虑只存储对称矩阵的下三角元素(上三角同样可行),即下图灰色部分
那么很显然,我们可以将这样一个对称矩阵压缩存储到一个一元数组中,从而节省较多的空间,接下来我们分析一下如何存储。
分析:第一行有一个元素,第二行有两个元素……第i行有i个元素……
若对称矩阵是n*n的,则我们需要一个长度为1+2+…+n的数组来依次存储每行元素,由如下的等差数列前n项和公式:
计算n*n的数组压缩存储时所需空间,求得:
以以上矩阵为例,我们需要一个长度为10的数组b来存储原数组a的所有下三角元素,接下来我们分析如何根据下标i,j获取到我们需要的那个数字。如根据2,1获取到下图中红框框住的元素2:
分析:首先,由于我们只存储了下三角元素,故而在接收到ij时需进行判断,若i≤j即为上三角的值,需swap(i,j)使得i≥j(因为矩阵是对称的);
保证ij为下三角的下标后,观察数组a。
第一行的元素1将存在数组b的第一个位置上,
第二行的两个元素3、-6将存在数组b的第二、三个位置上
……
第i行的i个元素将存在数组b的第1+2+…+(i-1)+1个位置上,
即前i-1行元素的个数(第x行有x个元素)+1,存储形式如下图所示:
那么现在我们用C++的模板实现对称矩阵的压缩存储。
成员变量应有T类型的指针_a,原数组(n*n)大小_n;
成员函数除去构造、析构函数,为了防止浅拷贝,应写出拷贝构造、赋值运算符重载、打印数组函数以及获取ij下标对应元素的函数。
代码如下:
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!!
- 对称矩阵的压缩存储
- 对称矩阵的压缩存储
- 对称矩阵的压缩存储
- 对称矩阵的压缩存储
- 对称矩阵的压缩存储
- ~对称矩阵的压缩存储~
- 对称矩阵的压缩存储
- 对称矩阵的压缩存储
- 对称矩阵的压缩存储
- 对称矩阵的压缩存储
- 对称矩阵、稀疏矩阵的压缩存储
- 对称矩阵压缩存储
- 对称矩阵压缩存储
- 对称矩阵 压缩存储
- 对称矩阵压缩存储
- 对称矩阵及对称矩阵的压缩存储
- 【数据结构】对称矩阵及对称矩阵的压缩存储
- 对称矩阵及对称矩阵的压缩存储
- 新手如何循序渐进学习3dmax室内设…
- PS饰品美工,淘宝珠宝首饰美工修图…
- 3个拍出好相片基本构图概念 …
- 3DMAX教程:《战神》次世代人物制…
- Java如何学习,从别的语言编程转Ja…
- 对称矩阵的压缩存储
- PS淘宝美工海报排版教程篇 PS…
- 婚纱摄影后期修片,PS婚纱写真后期…
- Spring Security @PreAuthorize 拦截无效
- ug设计绘图使用技巧,UG设计入门基…
- PS打造暗调高清的海景照片 摄…
- 【给新手】10分钟了解摄影的最基本…
- 学习UG,要从最基础的做起,初学者…
- 3dmax 怎么学最快 初学者必读