求两个对称矩阵之和与乘积

/**
*    实验题目:
*        求两个对称矩阵之和与乘积
*    实验目的:
*        掌握对称矩阵的压缩存储方法及相关算法设计
*    实验内容:
*        已知A和B为两个nxn阶的对称矩阵,输入时,对称矩阵只输入下三角形元素,
*    存入一维数组。设计程序,完成如下功能:
*    1、求对称矩阵A和B的和。
*    2、求对称矩阵A和B的乘积。
*/

#include <stdio.h>

#define N 4
#define M 10

/*-----------------------返回压缩存储a中a[i][j]的值-----------------------*/
/**
*   算法思路
*       对称矩阵M的第i行和第j列的元素的数据存储在一维数组a中的位置k的计算公式:
*   1、当i大于或等于j时,k = (i * (i + 1)) / 2 + j (下三角)
*   2、当i小于j时,k = (j * (j + 1)) / 2 + i (上三角)
*
*/
static int value(int a[], int i, int j)
{
    if(i >= j)
        return a[(i * (i + 1)) / 2 + j];
    else
        return a[(j * (j + 1)) / 2 + i];
}

/*-----------------------求压缩存储a和b的和-----------------------*/
static void madd(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);
        }
    }
}

/*-----------------------求压缩存储a和b的乘积-----------------------*/
static void mult(int a[], int b[], int c[][N])
{
    int i, j, k, sum;

    for(i = 0; i < N; i++)
    {
        for(j = 0; j < N; j++)
        {
            sum = 0;
            for(k = 0; k < N; k++)
            {
                sum = sum + value(a, i, k) * value(b, k, j);
            }
            c[i][j] = sum;
        }
    }
}

/*-----------------------输出压缩存储a-----------------------*/
static void disp1(int a[])
{
    int i, j;

    for(i = 0; i < N; i++)
    {
        for(j = 0; j < N; j++)
        {
            printf("%4d", value(a, i, j));
        }
        printf("\n");
    }
}

/*-----------------------输出对称矩阵c-----------------------*/
static 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");
    }
}

int main(int argc, char *argv[])
{
    int a[M] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; //a表示压缩存储的对称矩阵
    int b[M] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1};
    int c1[N][N], c2[N][N];

    printf("a矩阵:\n");
    disp1(a);
    printf("b矩阵:\n");
    disp1(b);

    madd(a, b, c1);
    printf("a+b:\n");
    disp2(c1);

    mult(a, b, c2);
    printf("a*b:\n");
    disp2(c2);

    return 0;
}

测试结果:

a矩阵:
   1   2   4   7
   2   3   5   8
   4   5   6   9
   7   8   9  10
b矩阵:
   1   1   1   1
   1   1   1   1
   1   1   1   1
   1   1   1   1
a+b:
   2   3   5   8
   3   4   6   9
   5   6   7  10
   8   9  10  11
a*b:
  14  14  14  14
  18  18  18  18
  24  24  24  24
  34  34  34  34

  • 12
    点赞
  • 98
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值