34-对称矩阵的压缩存储

这里写图片描述

对于矩阵这样由n行n列构成的数据集合,可以通过二维数组来进行存储。

在实际工程中也会用到一些特殊的矩阵, 特殊矩阵可以“压缩”的一种思维来降低空间需求。
(1)对角矩阵
(2)对称矩阵
(3)上三角矩阵/下三角矩阵

1. 对称矩阵的压缩存储

这里写图片描述

若一个n阶方阵A[n][n]中的元素满足aij=aji(0≤i,j≤n-1),则称其为n阶对称矩阵。

对称矩阵的压缩存储的策略:
存储时可只存储对称矩阵中上三角或下三角中的元素,使得对称的元素共享一个存储空间。

这里写图片描述

当在确定了这样的策略后,在原有的n阶矩阵中一共有n2个元素,在以行序为主序存储其下三角+对角线的元素时,只需要存储n(n+1)/2个元素。当在以行序为主序存储其上三角+对角线的元素时也只需要存储n(n+1)/2个元素。

2. 对称矩阵的压缩存储

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define N 4


//为N阶对称矩阵初始化存储空间
void Init_arr(int **p)
{
    if(p == NULL)
    {
        return;
    }
    //当确定了矩阵的压缩存储方式后,就可以分配存储空间了
    *p = (int *)malloc(sizeof(int) *(N*(N+1)/2));
}

//将A[i][j]的值e存储到b中
void arr_Assign(int *b , int e , int i , int j)
{
    if(i >= j)
    {   //存储下三角的数据元素到数组B中
        b[i*(i+1)/2 + j] = e;
    }
    else
    {
        //存储上三角的数据元素到数组B中
        b[j*(j+1)/2 +i] = e;
    }
}


//返回存储在b[M]中的A[i][j]值
int arr_Value(int *b , int i, int j)
{
    //取出数组b中的下三角数据元素
    if(i >= j)
    {
        return b[ i * (i + 1) / 2 + j];
    }
    else
    {
        return b[j * (j + 1) / 2 + i];
    }
}

//输出压缩存储在b中的对称矩阵
void Disp(int *b)
{
    int i;
    int j;
    for(i = 0; i < N; i++)
    {
        for(j = 0; j < N; j++)
        {
            printf("%4d" , arr_Value(b , i,j));
        }
        printf("\n");
    }
}

//销毁存储空间
void Destroy(int *b)
{
    free(b);
    b = NULL;
}

int main(void)
{
    int *arrB = NULL;
    int i = 0;
    int j = 0;
    int value = 0;

    Init_arr(&arrB);
    printf("请输入对称矩阵的下三角部分:\n");
    for(i = 0; i < N; i++)
    {
        printf("输入第%d行的%d个数据元素: ", i+1, i+1);
        for(j = 0; j <= i; j++)
        {
            scanf("%d" , &value);
            arr_Assign(arrB,value , i,j);
        }
    }
    //打印输出
    printf("输出对称矩阵;\n");
    Disp(arrB);
    Destroy(arrB);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值