数据结构-压缩矩阵-对称矩阵

矩阵是很多科学与工程计算问题中研究的数学对象。在此,我们感兴趣的不是矩阵本身,而是如何存储矩阵的元。从而使矩阵的各种运算能有效的进行。

通常。用高级语言编制程序时,都是用二维数组来存储矩阵元。然而,在数值分析中经常出现一些阶数很高的矩阵,同时在矩阵中有许多值相同的元素或者是零元素。有时为了节省存储空间,可以对这类矩阵进行压缩存储。所谓压缩存储是指:为多个值相同的元只分配一个存储空间,对零元不分配空间。

若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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值