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

来源:互联网 发布:c语言面向对象 编辑:程序博客网 时间:2024/06/02 01:24
问题描述:设计算法,实现两个用压缩形式
*/matrix.h:#include <stdio.h>#include <malloc.h>#define N 4                                     //定义矩阵阶数为4void Init(int *&b);                             //为N阶对称矩阵初始化存储数据的一维数组Bint 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)的基础上,此问题容易解决。不过需要注意的是,两矩阵相乘不是单纯的两矩阵同一位置上两个元素相乘。

 

0 0
原创粉丝点击