// 对称矩阵的压缩存储
/*
满足a[i][j] = a[j][i] 0 <= i,j <= n-1,则称为对称矩阵
对于对称矩阵,我们可以为每一对对称元分配一个存储空间,则可将n^2个元压缩
成n(n+1)/2个元的空间中。不失一般性,我们可以以行序为主序存储其下三角(包
括对角线)中的元。
假设以一维数组sa[n(n+1)/2]作为n阶对称矩阵A的存储结构,则sa[k]和矩阵元a[i][j]
之间存在着一一对应关系:
当i >= j 时,k = 1+2+...+i+j = (1+i)*i/2 + j;
当i < j 时,k = 1+2+...+j+i = (1+j)*j/2 + i;
*/
#include <iostream>
#include <cassert>
using namespace std;
typedef int ElemType;
#define MAX_ROW 20
#define MAX_COL 20
//typedef SymMat[MAX_ROW][MAX_COL];
typedef struct
{
int rows; //行数
int cols; //列数
//对称矩阵行列数一样
ElemType* base;
}SymMat;
//创建对称矩阵,进行了压缩存储的
//rows与cols是相等的,但为了保持矩阵下标的完整性,故一起写上吧
void CreateSymMat( SymMat& M, int rows, int cols )
{
assert( rows > 0 && cols > 0 && rows == cols );
if ( rows <= 0 || cols <= 0 || rows != cols )
return;
M.rows = rows;
M.cols = cols;
M.base = new ElemType[ (1+M.cols)*M.cols/2 ];
assert( M.base );
if ( !M.base )
exit( -2 );
//memset( M.base, 0, (1+M.cols)*M.cols/2 );
for( int i = 0; i < (1+M.cols)*M.cols/2; ++i )
*(M.base + i) = 0;
}
void DestroySymMat( SymMat& M )
{
if ( !M.base )
return;
delete[] M.base;
M.base = NULL;
}
ElemType& Value( SymMat& M, int row, int col )
{
assert( row > 0 && row < M.rows && col > 0 && col < M.cols );
int k = 0;
if ( row >= col )
{
k = (1+row)*row/2 + col;
}
else
{
k = (1+col)*col/2 + row;
}
return *(M.base+k);
}
int main( int argc, char** argv )
{
SymMat M;
CreateSymMat( M, 13, 13 );
cout << Value( M, 1, 2 ) << endl;
Value( M, 1, 2 ) = 123;
cout << Value( M, 1, 2) << endl;
DestroySymMat( M );
return 0;
}
//shan quan liang 2014.1.1
数据结构:矩阵的压缩存储(特殊矩阵)
最新推荐文章于 2024-08-07 14:47:09 发布