三元组稀疏矩阵的相加和转置

4 篇文章 0 订阅
2 篇文章 0 订阅

稀疏矩阵加法运算

对于矩阵的加法运算,只有两个“加数矩阵”为同型矩阵才能进行。两个·同型矩阵相加,其“和矩阵”仍为同型矩阵,其各个位置上的值等于两个“加数矩阵”对应位置的元素之和。

#include<stdio.h>
#define MAXSIZE 1000

typedef struct node
{
    int row,col,value;   //行、列、值
}Triple;
typedef struct lnode
{
    Triple data[MAXSIZE];   //非零元素信息
    int m,n,nums;     //矩阵总行数、列数、非零元素个数
}TSMatrix;

void Input(TSMatrix *tm);   //矩阵输入
void Print(TSMatrix tm);    //矩阵输出
int MAdd(TSMatrix *c,TSMatrix a,TSMatrix b);    //矩阵加法
void Transpose(TSMatrix A,TSMatrix *B);         //矩阵转置

int main()
{
    TSMatrix A,B,C,D;
    Input(&A);
    Input(&C);
    Transpose(A,&B);
    printf("A转置后矩阵:\n");
    Print(B);
    if (MAdd(&D,A,C))
    {
        printf("A、C相加后矩阵:\n");
        Print(D);
    }    
    return 0;
}

void Input(TSMatrix *tm)
{
    int i;
    printf("输入总行数、总列数、非零元素个数:\n");
    scanf("%d %d %d",&(tm->m),&(tm->n),&(tm->nums));
    for ( i = 0; i < tm->nums; i++)
    {
        printf("请输入行、列、值:\n");
        scanf("%d %d %d",&(tm->data[i].row),&(tm->data[i].col),&(tm->data[i].value));
    }
    
}
void Print(TSMatrix tm)
{
    int i;
    printf("行列数:%d %d %d\n",tm.m,tm.n,tm.nums);
    for ( i = 0; i < tm.nums; i++)
    {
        printf("%d %d %d\n",tm.data[i].row,tm.data[i].col,tm.data[i].value);
    }
}
void Transpose(TSMatrix A,TSMatrix *B)
{
    int i,j,k;
    B->m = A.n;
    B->n = A.m;
    B->nums = A.nums;
    if (B->nums>0)
    {
        j = 0;
        for ( k = 0; k < A.n; k++)
        {
            for ( i = 0; i < A.nums; i++)
            {
                if (A.data[i].col==k)
                {
                    B->data[j].col = A.data[i].row;
                    B->data[j].row = A.data[i].col;
                    B->data[j].value = A.data[i].value;
                    j++;
                    if(j > A.nums) return;
                } 
            }
        } 
    } 
}
int MAdd(TSMatrix *c,TSMatrix a,TSMatrix b)
{
    if (a.m!=b.m||a.n!=b.n)
        return 0;                               /* A,B行列数不相等 */
    int i,j;
    i=0; j=0;                                   /* i,j分别指向两个矩阵三元表下标 */
    c->m = a.m;
    c->n = a.n;
    c->nums = 0;
    while (i<a.nums&&j<b.nums)
    {
        if (a.data[i].row<b.data[j].row)        /* 情况1 */
            c->data[c->nums++]=a.data[i++];
        else if (a.data[i].row>b.data[j].row)   /* 情况2 */
            c->data[c->nums++]=b.data[j++];
        else                                    /* 3:行相同位置 */
        {
            if (a.data[i].col<b.data[j].col)        /* 情况3.1 */
                c->data[c->nums++]=a.data[i++];
            else if (a.data[i].col>b.data[j].col)   /* 情况3.2 */
                c->data[c->nums++]=b.data[j++];
            else                                    /* 列相同位置 */
            {
                int sum = a.data[i].value + b.data[j].value;
                if (sum)
                {
                    c->data[c->nums] = a.data[i];
                    c->data[c->nums].value = sum;
                    c->nums++;
                }
                i++; j++;
            }
        }
    }
    while (i < a.nums)  c->data[c->nums++] = a.data[i++];
    while (j < b.nums)  c->data[c->nums++] = b.data[j++];
    return 1;
}
  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值