您的位置:首页 > 理论基础 > 数据结构算法

数据结构::矩阵(一)--对称矩阵及对称矩阵的压缩存储

2016-12-12 18:38 267 查看
【对称矩阵】:

1、定义:元素以对角线为对称轴对应相等的矩阵。

     设一个N*N的方阵A,A中任意元素Aij,当且仅当Aij == Aji(0
<= i <= N-1
&& 0 <= j <= N-1),则矩阵A是对称矩阵。以矩阵的对角线为分隔,分为上三
角和下三角。

【对称矩阵的压缩存储】:

1、压缩存储称矩阵存储时只需要存储上三角/下三角的数据,所以最多存
储n(n+1)/2个数据。
2、对称矩阵和压缩存储的对应关系:下三角存储i>=j,
SymmetricMatrix[i][j] ==
Array[i*(i+1)/2+j]

**下面给出对称矩阵的实现代码**:

#include<iostream>
using namespace std;
template<typename T>
class SymmetricMatrix
{
public:
//构造函数
SymmetricMatrix()
{}
SymmetricMatrix(T* a, size_t n)
:_a(new T[n*(n+1)/2])
,_n(n)
{
size_t index = 0;
for(size_t i= 0; i<_n; i++)
{
for(size_t j = 0; j<_n; j++)
{
if(i >= j)
{
_a[index] = a[i*n+j];
index++;
}
else
{
break;
}
}
}
}
//析构函数
~SymmetricMatrix()
{
if(_a)
{
delete[]_a;
}
}
//判断数组是否是访问下三角的
T& Access(size_t i,size_t j)
{
if(i <= j)
{
std::swap(i,j);
}
return _a[i*(i+1)/2+j];
}
//打印对称矩阵
void Print()
{
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; //因为是n*n的,直接给n就可以了

};
void Test()
{
int a [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*)a,5);
sm.Print();
}
int main()
{
Test();
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: