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

【对称矩阵】

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
using namespace std;
template
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< sm((int*)a,5);
	sm.Print();
}
int main()
{
	Test();
	return 0;
}


你可能感兴趣的:(数据结构)