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的矩阵,矩阵中有效值的个数远远小于无效值的个数,且有效值的分布没有规律,这就是稀疏矩阵.如何高效的去存储一个稀疏矩阵呢?要想高效的存储一个稀