对称矩阵&稀疏矩阵的两种转置算法

SymmentryMatrix(对称矩阵)

    对称矩阵和对称矩阵的压缩存储>

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

 我们发现如果将该对称矩阵的每个元素都存入则会存在内存浪费问题,那仫如何解决? 这就提到了对称矩阵的压缩存储了--则只需要存储上三角或者下三角的元素即可。

     注意:

     (1).在对称矩阵的压缩存储中因为只存储上三角或者下三角则每一行的有效数据为:0,1,2,3,4(以5*5的方阵为例),那仫根据等差数列的特性最多存储n*(n+1)/2个元素

     (2).在输出压缩存储的对称方阵的时候,假设存储的是下三角,如果该下标属于下三角(i >= j)则直接输出,如果要输出的下标属于上三角(i < j)则需要将该上三角的行列交换.

      


//对称矩阵的存储
template<typename T>
class SymMatrix
{
public:
	SymMatrix(T *matrix,size_t n)
		:_matrix(new T[n*(n+1)/2])
		,_size(n*(n+1)/2)
		,_n(n)
	{
		for(size_t i=0;i<n;++i)   //存储下三角
		{
			for(size_t j=0;j<n;++j)
			{
				if (i >= j)
				{
					_matrix[i*(i+1)/2+j]=matrix[i*n+j];
				}
			}
		}
	}
	T& Access(size_t i,size_t j)
	{
		if(i < j)    //如果是上三角元素
		{
			swap(i,j);
		}
		return _matrix[i*(i+1)/2+j];
	}
	void PrintSymMatrix()
	{
		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* _matrix;
	size_t _size;
	size_t _n;
};



 

 SpareMatrix(稀疏矩阵)

     稀疏矩阵的三元组存储和稀疏矩阵的两种转置算法>

     M*N的矩阵,矩阵中有效值的个数远远小于无效值的个数,且有效值的分布没有规律,这就是稀疏矩阵.如何高效的去存储一个稀疏矩阵呢?要想高效的存储一个稀

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值