行逻辑三元组稀疏矩阵加减乘的编程实现

目的:
        编程实现稀疏矩阵的四则运算。
实现:
1. 稀疏矩阵的存储结构采用行逻辑表示的三元组
2.

#define MAXSIZE  12500
#define MAXRC 12500
typedef struct {
    int i, j;
    int e;
}Triple;
typedef struct {
    Triple data[MAXSIZE + 1];
    int rpos[MAXRC + 1];
    int mu, nu, tu;
}RLSMatrix;

        先通过创建mu nu tu的值再根据这些值采用循环输入得到data,之后再通过扫描确定rpos的值则可以完成创建。
        通过三元组的形式将非零元对应的行列以及数值存储下来,再由稀疏矩阵结构存下矩阵的行数列数以及非零元个数,即可囊括稀疏矩阵的所有信息。这样就可以以三元组的形式把矩阵非零元素存储下来,节省了存储量的同时便于矩阵运算。

  1. 矩阵的加法
           根据矩阵的相关知识,两个矩阵相加要求两个矩阵的行数,列数要相等。故需要设置判断是否满足矩阵相加的条件。若满足条件,则进行加法运算。根据矩阵加法法则,得到的新矩阵拥有与原来两矩阵相同的行数和列数,其元素数值则为两矩阵对应位置的元素值之和。

  2. 矩阵的减法
           和加法相同地根据三种情况采用三个循环处理对应的数据,只不过两个都有的情况结果要变为两者之差,N有M没有的情况要改为N元素的相反数,其余相同。则可以得到减法的算法。

  3. 矩阵的乘法
            根据矩阵乘法的理论,在满足M.nu==N.mu的情况下,新矩阵Q(i,j)的值即满足M(i,k)与N(k,j)的所有元素乘积之和。对于稀疏矩阵不需要对满足条件的每个元素都进行乘积,因为两者中若有一个为零则其乘积为零。所以只要在所有非零元中找到满足条件的配对进行相乘,在将乘积进行累加即可得到该位置的元素值。结合rpos可以高效地进行循环查找。
    程序代码:
    Matrix.h文件

#include<stdio.h>
#define MAXSIZE  12500
#define MAXRC 12500
#define ERROR 0
#define OK 1
typedef struct {
    int i, j;
    int e;
}Triple;
typedef struct {
    Triple data[MAXSIZE + 1];
    int rpos[MAXRC + 1];
    int mu, nu, tu;
}RLSMatrix;
void CreateMatrix(RLSMatrix *M);
void Initrpos(RLSMatrix *M);
void Printrpos(RLSMatrix M);
int Add(RLSMatrix M, RLSMatrix N, RLSMatrix  *sum);
int Minus(RLSMatrix M, RLSMatrix N, RLSMatrix *minus);
int Multi(RLSMatrix M, RLSMatrix N, RLSMatrix *multi);
void PrintMatrix(RLSMatrix M);

Matrix.c文件

#include<stdio.h>
#include"Matrix.h"
void CreateMatrix(RLSMatrix *M) {
    printf("请输入矩阵的行数,列数,和非零元个数\n");
    scanf("%d%d%d", &M->mu, &M->nu, &M->tu);
    if (M->tu > (M->mu)*(M->nu)) { printf("该矩阵不存在!请重新输入!\n"); CreateMatrix(&M); }
    int s;
    for (s = 1; s <= M->tu; s++) {
        printf("请输入第%d非零元所在的行,列,及其数值\n", s);
        scanf("%d%d%d", &M->data[s].i, &M->data[s].j, &M->data[s].e);
        if (M->data[s].i < 0) { printf("行数须为正数!\n"); s -= 1; continue; }
        if(M->data[s].j < 0) { printf("列数须为正数!\n"); s -= 1; continue; }
        if(M->data[s].e==0){ pri
  • 7
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值