对称矩阵的压缩存储

来源:互联网 发布:广联达软件下载教程 编辑:程序博客网 时间:2024/05/21 10:09

首先来看什么是对称矩阵:

设一个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] ==arry[i*(i+1)/2+j]

比如下面的例子:

                          

可以看到上三角和下三角数据相同,那么我们存储时只需存储一个三角的数据就可以,很好的节省了空间。

代码实现部分:

//头文件#pragma once#include<iostream>using namespace std;#include<vector>template<typename T>class SymmetricMatrix{public:SymmetricMatrix(T* a,size_t n):_a(new T[n*(n+1)/2]),_n(n){size_t idx = 0;for (size_t i = 0; i < n; i++){for (size_t j = 0; j < n; j++){if (i >= j){_a[idx++] = a[i*n+j];}else{break;}}}}T& Access(size_t i, size_t j){if (i <j){swap(i, j);}return _a[(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*_a;size_t _n;};

//测试部分#include"Matrix.h"void TestMatrix(){int arr[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*)arr, 5);sm.Display();}int main(){TestMatrix();system("pause");} 


这里说一下最关键的部分思路:我这里采用的是下三角存储,所以开辟空间时只需要new T [n*(n+1)/2] 就可以,以一维数组的方式存储,比如_a[0]=0,_a[1]=1,_a[2]=0,_a[3]=2,_a[4]=1,_a[5]=0以此类推,所以实际上开辟的一位数组里边一共存储了15个元素。再来看打印函数,怎么把所有的元素打印出来呢?两个for循环遍历二维数组的所有元素时,当遍历到右上角元素时,可以把横坐标和纵坐标交换,转为对应左下角的元素,再输出

运行结果:



1 0
原创粉丝点击