以三元组表为存储结构实现矩阵相加(耿5.7)

Description

假设稀疏矩阵A和B均以三元组表作为存储结构。试编写矩阵相加的程序,另设三元组表C存放结果矩阵。矩阵大小为m行n列(0<m,n<100)

Input

第一行输入t1,t2(0<t1,t2<100) ,t1和t2分别是矩阵A和B中非零元素的个数,后面t1+t2行分别输入A和B中的元素,用三元组表示。

Output

输出三元组表C。

  • Sample Input 
    3 3
    1 2 3
    3 2 1
    3 4 2
    1 1 4
    3 2 5
    3 4 1
  • Sample Output
    1 1 4
    1 2 3
    3 2 6
    3 4 3
#include<stdio.h>  
#include<stdlib.h>  
  
#define MAXSIZE 100  
  
typedef struct {  
  int  i,j; // 行下标,列下标  
  int  e; // 非零元素值  
}Triple;  
  
typedef struct  {  
  Triple data[MAXSIZE+1]; // 非零元三元组表,data[0]未用  
  int mu,nu,tu; // 矩阵的行数、列数和非零元个数  
}TSMatrix;  
  
TSMatrix AddTSM(TSMatrix A,TSMatrix B)  
{  
    TSMatrix C;  
    int ai,bi,ci,aj,bj,cj,ap,bp,cp;  
    ap = bp = cp = 1;  
    C.mu = A.mu;  
    C.nu = A.nu;  
    while(ap <= A.tu && bp <= B.tu){  
        ai = A.data[ap].i;  
        bi = B.data[bp].i;  
        if(ai > bi){  
            ci = bi;  
            while(ci == B.data[bp].i){  
                C.data[cp].i = ci;  
                C.data[cp].j = B.data[bp].j;  
                C.data[cp].e = B.data[bp].e;  
                ++bp;  
                ++cp;  
            }  
        }  
        else if(ai < bi){  
           ci = ai;  
           while(ci == A.data[ap].i){  
                C.data[cp].i = ci;  
                C.data[cp].j = A.data[ap].j;  
                C.data[cp].e = A.data[ap].e;  
                ++ap;  
                ++cp;  
            }  
        }  
        else if(ai == bi){  
            ci = ai;  
            aj = A.data[ap].j;  
            bj = B.data[bp].j;  
            if(aj > bj){  
                C.data[cp].i = ci;  
                C.data[cp].j = bj;  
                C.data[cp].e = B.data[bp].e;  
                ++cp;  
                ++bp;  
            }  
            else if(aj < bj){  
                C.data[cp].i = ci;  
                C.data[cp].j = aj;  
                C.data[cp].e = A.data[ap].e;  
                ++cp;  
                ++ap;  
            }  
            else if(aj == bj){  
                if(A.data[ap].e + B.data[bp].e != 0){  
                    C.data[cp].i = ci;  
                    C.data[cp].j = aj;  
                    C.data[cp].e = A.data[ap].e + B.data[bp].e;  
                    ++cp;  
                }  
                ++ap;  
                ++bp;  
            }  
        }  
    }  
    //以上为稀疏矩阵A或B中的元素完全加完的情况  
    //以下为稀疏矩阵A或B中的元素部分剩余的情况  
    while(ap <= A.tu){  
        C.data[cp].i = A.data[ap].i;  
        C.data[cp].j = A.data[ap].j;  
        C.data[cp].e = A.data[ap].e;  
        ++cp;  
        ++ap;  
    }  
    while(bp <= B.tu){  
        C.data[cp].i = B.data[bp].i;  
        C.data[cp].j = B.data[bp].j;  
        C.data[cp].e = B.data[bp].e;  
        ++cp;  
        ++bp;  
    }  
    C.tu = --cp;  
    return C;  
}  
  
int main()  
{  
    TSMatrix A;  
    TSMatrix B;  
    int t1,t2,i;  
    scanf("%d %d",&t1,&t2);  
    A.tu=t1;  
    A.mu=100;  
    A.nu=100;  
    B.tu=t2;  
    B.mu=100;  
    B.nu=100;  
    for(i=1;i<=t1;i++)  
    {  
        scanf("%d %d %d",&A.data[i].i,&A.data[i].j,&A.data[i].e);  
    }  
    for(i=1;i<=t2;i++)  
    {  
        scanf("%d %d %d",&B.data[i].i,&B.data[i].j,&B.data[i].e);  
    }  
    TSMatrix C;  
    C=AddTSM(A,B);  
    for(i=1;i<=C.tu;i++)  
    {  
        printf("%d %d %d\n",C.data[i].i,C.data[i].j,C.data[i].e);  
    }  
    return 0;  
}  

  • 5
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 三元组顺序是一种存储稀疏矩阵的方式,可以用来矩阵中非零元素的位置和值。其中,每个三元组包含三个元素:行号、列号和元素值。 要实现两个矩阵相加和相减,需要先将它们转换成三元组顺序的形式,然后按照行号和列号的顺序进行遍历,将相同位置的元素相加或相减,最后得到结果矩阵三元组顺序。 转置操作可以通过交换每个三元组的行号和列号来实现。具体地,对于一个三元组 (i, j, v),它在转置后的矩阵中的位置应该是 (j, i, v)。 总之,使用三元组顺序存储稀疏矩阵可以方便地实现矩阵的加减和转置操作。 ### 回答2: 三元组顺序是一种稀疏矩阵存储方式,通过记录非零元素的值、所在行列号来压缩示大量零元素的矩阵,节约存储空间。实现两个矩阵相加、相减与转置,需要按照三元组顺序存储方式,对两个矩阵的数据进行处理。 1. 三元组顺序存储方式: 三元组顺序的每个元素由三个部分组成:非零元素值、所在行号、所在列号。非零元素在三元组中按行、列顺序排列,同一行的元素按列递增排序。例如,一个5*5的矩阵: 0 0 1 0 0 0 2 0 3 0 4 0 0 0 5 0 6 0 7 8 0 0 9 10 0 可以用三元组顺序示为: (5, 5, 7) # 稀疏矩阵的行列数、非零元素个数 [(1, 3, 1), (2, 2, 2), (2, 4, 3), (3, 1, 4), (3, 5, 5), (4, 2, 6), (4, 4, 7), (4, 5, 8), (5, 3, 9), (5, 4, 10)] # 非零元素的三元组 2. 稀疏矩阵相加、相减: 对于两个矩阵相加、相减,需要先将它们的三元组按行列号排序,然后按照顺序遍历两个三元,将行列号相同的元素相加或相减,得到新的三元。具体步骤如下: (1) 将两个矩阵三元组按行列号排序 (2) 从头开始遍历两个三元,若行列号相同,则将两元素相加或相减,并加入结果矩阵三元中 (3) 若行列号不同,则将较小的行列号的元素加入结果矩阵三元中 (4) 若一个三元遍历完,则将另一个三元的剩余元素加入结果矩阵三元中 3. 稀疏矩阵转置: 对于矩阵的转置,同样需要将矩阵三元组按行列号排序。然后,遍历三元,将每个元素的行列号交换,并插入到转置后的三元中。具体步骤如下: (1) 将矩阵三元组按行列号排序 (2) 从头开始遍历三元,将每个元素的行列号交换,并插入到转置后的三元中 以上就是用三元组顺序存储稀疏矩阵实现两个矩阵相加、相减与转置的方法。矩阵相加、相减的时间复杂度为O(n),转置矩阵的时间复杂度为O(nlogn)。 ### 回答3: 稀疏矩阵是指大部分元素为0的矩阵,因为这些元素对于运算并没有实质性的作用,所以使用三元组顺序存储稀疏矩阵可以极大地提高运算效率。 三元组顺序是一种以三元组的形式进行存储的数据结构,以此存储稀疏矩阵可以节省存储空间。其中,每个三元组都包含三个数据项,分别是该非零元素的行数、列数以及元素值,可以示为(i, j, value)。 相加与相减 使用三元组顺序存储两个稀疏矩阵,可以通过从数组中遍历每个非零元素,并比较其在两个矩阵中的位置来实现两个矩阵的加减。具体步骤如下: 1. 遍历两个矩阵三元组数组,分别找到相同行数和列数的非零元素。 2. 比较两个矩阵相同位置的元素大小,决定是相加还是相减。 3. 若某一矩阵当前行或列已经遍历完,而另一矩阵还有未遍历到的行或列,则将剩余部分复制到结果数组中。 转置 稀疏矩阵的转置是指将矩阵中所有元素绕对角线翻转,即将矩阵的行和列交换。对于三元组顺序来说,转置操作需要改变存储方式,即改变原先每个元素的行数和列数,将其进行交换,同时保留其元素值不变。 具体步骤如下: 1. 读取原矩阵中的每一个三元组(i, j, value)。 2. 将该三元组的行数和列数对换(i,j变为j,i),并将它的元素值存入新矩阵中它对应的位置。 3. 将新矩阵中所有三元组按行数从小到大进行排序,使其成为三元组顺序。 4. 输出结果矩阵。 总之,使用三元组顺序存储稀疏矩阵,可以有效节省运算时间和存储空间。相加、相减和转置都可以通过遍历矩阵中的三元组来实现,对于数据处理的稀疏矩阵,这种存储方式可以提高运算效率。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值