第九周 对称矩阵压缩存储的实现和应用

问题描述:设计算法,实现两个用压缩形式
*/
matrix.h:


#include <stdio.h>
#include <malloc.h>
#define N 4                                     //定义矩阵阶数为4
void Init(int *&b);                             //为N阶对称矩阵初始化存储数据的一维数组B
int Value(int b[], int i, int j);               //返回存储在b[M]中,对应二维数组A[i][j]的值
void Assign(int b[], int e, int i, int j);      //将e赋值给对应二维数组元素A[i][j],要存储到B[M]中
void Disp1(int b[]);                            //输出压缩存储在b中的对称矩阵
void Destroy(int b[]);                          //销毁存储空间
void Matrixadd(int a[],int b[],int c[][N]);     //对称矩阵相加
void Matrixmul(int a[],int b[],int c[][N]);     //对称矩阵相乘
void Disp2(int c[][N]);                         //输出对称矩阵相加或相乘的结果
matrix.cpp:


#include "matrix.h"
void Init(int *&b)                             //为N阶对称矩阵初始化存储数据的一维数组B
{
    b=(int *)malloc(sizeof(int)*(N*(N+1)/2));
}
int Value(int b[], int i, int j)               //返回存储在b[M]中,对应二维数组A[i][j]的值
{
    if(i>=j)
        return b[(i*(i+1))/2+j];
    else
        return b[(j*(j+1))/2+i];
}
void Assign(int b[], int e, int i, int j)      //将e赋值给对应二维数组元素A[i][j],要存储到B[M]中
{
    if(i>=j)
        b[i*(i+1)/2+j]=e;
    else
        b[j*(j+1)/2+i]=e;
    return;
}
void Disp1(int b[])                            //输出压缩存储在b中的对称矩阵
{
    int i,j;
    for(i=0;i<N;i++)
    {
        for(j=0;j<N;j++)
            printf("%4d",Value(b,i,j));
        printf("\n");
    }
}
void Destroy(int b[])                          //销毁存储空间
{
    free(b);
}
void Matrixadd(int a[],int b[],int c[][N])     //对称矩阵相加
{
    int i,j;
    for(i=0;i<N;i++)
        for(j=0;j<N;j++)
            c[i][j]=Value(a,i,j)+Value(b,i,j);
}
void Matrixmul(int a[],int b[],int c[][N])     //对称矩阵相乘
{
    int i,j,k;
    int sum;
    for(i=0;i<N;i++)
    {
        for(j=0;j<N;j++)
        {
            sum=0;
            for(k=0;k<N;k++)
                sum+=(Value(a,i,k)*Value(b,k,j));
            c[i][j]=sum;
        }
    }
}
void Disp2(int c[][N])                            //输出对称矩阵相加或相乘的结果
{
    int i,j;
    for(i=0;i<N;i++)
    {
        for(j=0;j<N;j++)
            printf("%4d",c[i][j]);
        printf("\n");
    }
}
main.cpp:


#include <stdio.h>
#include "matrix.h"
int main()
{
    int i,j,num;
    int *a,*b;                      //定义两对称矩阵
    int c1[N][N],c2[N][N];          //c1--对称矩阵相加结果  c2--对称矩阵相乘结果
    Init(a);                        //初始化,一次分配空间
    Init(b);
    while(1)
    {
        printf("请输入对称矩阵a(只需要输入下三角部分即可):\n");
        for(i=0;i<N;i++)
        {
            printf("输入第%d行的%d个数据元素",i+1,i+1);
            for(j=0;j<=i;j++)
            {
                scanf("%d",&num);
                Assign(a,num,i,j);
            }
        }
        printf("请输入对称矩阵b(只需要输入下三角部分即可):\n");
        for(i=0;i<N;i++)
        {
            printf("输入第%d行的%d个数据元素",i+1,i+1);
            for(j=0;j<=i;j++)
            {
                scanf("%d",&num);
                Assign(b,num,i,j);
            }
        }
        Matrixadd(a,b,c1);
        Matrixmul(a,b,c2);
        printf("对称矩阵a为:\n");
        Disp1(a);
        printf("对称矩阵b为:\n");
        Disp1(b);
        printf("a+b为:\n");
        Disp2(c1);
        printf("a*b为:\n");
        Disp2(c2);
        printf("\n");
    }
    return 0;
}


存储的对称矩阵A和B的加法和乘法。实现中请使用好前面设计的基本运算。*输入描述:两个矩阵的下三角部分*程序输出:A+B,A*B

知识点总结:

        对称矩阵的基本运算

心得体会:

        在(1)的基础上,此问题容易解决。不过需要注意的是,两矩阵相乘不是单纯的两矩阵同一位置上两个元素相乘。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值