注意:以下所有代码均在VS2010环境下运行测试
了解了C语言以后,我们都知道,要存储一个矩阵,用一个二维数组即可实现,今天,由我来带领大家玩点新鲜的,对矩阵进行压缩存储并对其进行转置。
一、对称矩阵及对称矩阵的压缩存储
1、什么是对称矩阵?
设一个N*N的方阵A,A中任意元素Aij,当且仅当Aij == Aji(0 <= i <= N-1
&& 0 <= j <= N-1),则矩阵A是对称矩阵。以矩阵的对角线为分隔,分为上三
角和下三角。
2、对称矩阵的压缩存储
压缩存储称矩阵存储时只需要存储上三角/下三角的数据,所以最多存
储n(n+1)/2个数据(相当于1+2+...+n,即等差数列求和)。
对称矩阵和压缩存储的对应关系:下三角存储i>=j, SymmetricMatrix[i][j] ==
Array[i*(i+1)/2+j]
3、对称矩阵举例
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
4、代码实现对称矩阵的压缩存储
#include <iostream>
using namespace std;
template <typename T>
class SymmetricMatrix
{
public:
SymmetricMatrix(T* arr,size_t n)
:_data(new T[n*(n+1)/2])//已知空间大小为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)//下三角
{
_data[index] = arr[i*n+j];
index++;
}
else//上三角
{
break;
}
}
}
}
T& Access(size_t i,size_t j)//获取上三角的数据
{
if (i >= j)//下三角元素
{
//由对称矩阵可得i>=j, A[i][j] ==_data[i*(i+1)/2+j]
return _data[i*(i+1)/2+j];
}
else//上三角元素
{
swap(i,j);//行列交换
return _data[i*(i+1)/2+j];
}
}
void PrintSymmetricMatrix()
{
cout<<"SymmetricMatrix:"<<_n<<"行"<<_n<<"列"<<endl;
for (size_t i = 0; i < _n; i++)
{
for (size_t j = 0; j < _n; j++)
{
cout<<Access(i,j)<<" ";
}
cout<<endl;
}
cout<<endl;
}
~SymmetricMatrix()
{
if (NULL != _data)
{
delete []_data;
_data = NULL;
}
}
protected:
T* _data;
size_t _n;
};
void TestSymmetricMatrix()
{
int a [5][5]=
{
{0,1,2,3,4},