矩阵是很多科学与工程计算问题中研究的数学对象。在此,我们感兴趣的不是矩阵本身,而是如何存储矩阵的元。从而使矩阵的各种运算能有效的进行。
通常。用高级语言编制程序时,都是用二维数组来存储矩阵元。然而,在数值分析中经常出现一些阶数很高的矩阵,同时在矩阵中有许多值相同的元素或者是零元素。有时为了节省存储空间,可以对这类矩阵进行压缩存储。所谓压缩存储是指:为多个值相同的元只分配一个存储空间,对零元不分配空间。
若n阶矩阵A中的元满足下列性质 aij = aji 1<=i,j<=n 则称n阶对称矩阵。对于其,我们可以为每一对对称元分配一个存储空间,则将n^2个元压缩存储到n(n+1)/2个元的空间中。
假设以一维数组sa[n(n+1)/2] 作为n阶对称矩阵A的存储结构,则sa[k]和矩阵元aij这之间存在者一一对应的关系:
k=
i(i+1)/2 + j -1 ( i>=j)
j(j+1)/2 + i - 1 (i<j)
首先是辅助宏的定义:
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define OVERFLOW -1
#define UNDERFLOW -2
typedef int Status;
typedef int ElemType;
对称矩阵的存储结构定义:
//压缩对称矩阵的存储结构定义
typedef struct{
ElemType *elem;
int MatrixOrder; //阶数
}SymMatrix;
初始化对称矩阵.
Status InitMatrix(SymMatrix &M){
//初始化对称矩阵
scanf("%d",&M.MatrixOrder);
if(M.MatrixOrder<=0)//如果阶数不合法
return ERROR;
M.elem=(ElemType *)malloc(M.MatrixOrder*(M.MatrixOrder+1)/2*sizeof(ElemType));
if(!M.elem)//存储分配失败
exit(OVERFLOW);
return OK;
}
将第i行第j列的元素用e带回 返回OK i>=1 j>=1
Status GetElem(SymMatrix &M,int i,int j,ElemType &e){
//将第i行第j列的元素用e带回 返回OK i>=1 j>=1
if(i<1||i>M.MatrixOrder||j<1||j>M.MatrixOrder) //i,j不合法 返回ERRLR
return ERROR;
int k;
if(i>=j) //在下三角
k=(i-1)*i/2+j-1;
else//上三角
k=(j-1)*j/2+i-1;
e=M.elem[k];
return OK;
}