三元组实现的稀疏矩阵的加法

【问题】稀疏矩阵的加法,输入任意两个稀疏矩阵A和B,求出它们的和矩阵C。

【思路】 比较满足条件(行数及列数都相同的两个矩阵)的两个稀疏矩阵中不为零的元素的行号及列号(即i与j),将i与j都相等的AB中两个元素值相加,若相加结果不为零则保持i,j不变存储在新的三元组C中 ;若不等的话则按行递增的顺序分别储存在新的三元组中。最后得到的这个新三元组表就是两个矩阵的和矩阵的三元组表。
5种情况:
A.data[m].row=B.data[n].row 且A.data[m].col=B.data[n].col
A.data[m].row=B.data[n].row 且A.data[m].col<B.data[n].col
A.data[m].row=B.data[n].row 且A.data[m].col>B.data[n].col
A.data[m].row<B.data[n].row
A.data[m].row>B.data[n].row

【提醒】在解决此问题前先弄清楚稀疏矩阵的存储有利于更好的解决问题。本文处理的是以按行递增方式储存的稀疏矩阵。


#include<iostream>
using namespace std;
const int MaxTerm = 100;

template<class DataType>
struct element
{
    int row,col;
    DataType item;
};

template<class DataType>
struct SparseMatrix
{
    element<DataType> data[MaxTerm];
    int mu,nu,tu;     //行数列数与非零个数
};

bool MatAdd(SparseMatrix<int> Matrix_1, SparseMatrix<int> Matrix_2, SparseMatrix<int> &Matrix_tmp)
{
    if(Matrix_1.mu != Matrix_2.mu || Matrix_1.nu != Matrix_2.nu)
        return 0;

    Matrix_tmp.mu = Matrix_1.mu;
    Matrix_tmp.nu = Matrix_1.nu;

    int i=0, j=0, k=0;
    int v;
    while(i<Matrix_1.tu && j<Matrix_2.tu)
    {
        if(Matrix_1.data[i].row == Matrix_2.data[j].row)
        {
            if(Matrix_1.data[i].col == Matrix_2.data[j].col)
            {
                Matrix_tmp.data[k].row = Matrix_1.data[i].row;
                Matrix_tmp.data[k].col = Matrix_1.data[i].col;
                v = Matrix_1.data[i].item + Matrix_2.data[j].item;
                if(v != 0)
                    Matrix_tmp.data[k].item = v;
                i++;j++;k++;  //处理下一个元素
            }
            else if(Matrix_1.data[i].col < Matrix_2.data[j].col)
            {
                Matrix_tmp.data[k].row = Matrix_1.data[i].row;
                Matrix_tmp.data[k].col = Matrix_1.data[i].col;
                Matrix_tmp.data[k].item = Matrix_1.data[i].item;
                i++;k++;     
             //Matrix_2还需进行下一轮比较(由稀疏矩阵的存储方式决的)
            }
            else if(Matrix_1.data[i].col > Matrix_2.data[j].col)
            {
                Matrix_tmp.data[k].row = Matrix_2.data[j].row;
                Matrix_tmp.data[k].col = Matrix_2.data[j].col;
                Matrix_tmp.data[k].item = Matrix_2.data[j].item;
                j++;k++;      //Matrix_1还需进行下一轮比较
            }
        }

        else if(Matrix_1.data[i].row < Matrix_2.data[j].row)
        {
            Matrix_tmp.data[k].row = Matrix_1.data[i].row;
            Matrix_tmp.data[k].col = Matrix_1.data[i].col;
            Matrix_tmp.data[k].item = Matrix_1.data[i].item;
            i++;k++;
        }
        else
        {
            Matrix_tmp.data[k].row = Matrix_2.data[j].row;
            Matrix_tmp.data[k].col = Matrix_2.data[j].col;
            Matrix_tmp.data[k].item = Matrix_2.data[j].item;
            j++;k++;
        }
    }
    Matrix_tmp.tu = k;

    return true;
}

SparseMatrix<int> CreatMat()
{
    SparseMatrix<int> Matrix;
    int m,n,t;
    cout << "请输入矩阵行数列数以及非零元个数: ";
    cin >> m >> n >> t;
    Matrix.mu = m;
    Matrix.nu = n;
    Matrix.tu = t;

    for(int i=0; i<Matrix.tu; i++)
    {
        int row,col,item;
        cout << "输入矩阵元素所在的行、列以及它的值: ";
        cin >> row >> col >> item;
        Matrix.data[i].row = row;
        Matrix.data[i].col = col;
        Matrix.data[i].item = item;
    }

    return Matrix;
}

void Printf(SparseMatrix<int> T)
{
    for(int i=0; i<T.tu; i++)
    {
        cout << " row: " << T.data[i].row << " "
             << " col: " << T.data[i].col << " "
             << " item: " << T.data[i].item << endl;
    }
}

int main()
{
    SparseMatrix<int> Mat1,Mat2,Mat3;
    Mat1 = CreatMat();
    Mat2 = CreatMat();
    cout << "Mat1: " << endl;
    Printf(Mat1);
    cout << "Mat2: " << endl;
    Printf(Mat2);
    if(MatAdd(Mat1,Mat2,Mat3))
    {
        cout << "Mat1 + Mat2: " << endl;
        Printf(Mat3);
    }
    else
    {
        cout << "相加失败。" << endl;
    }
    return 0;
}

若有考虑不周之处,还望指正。

  • 7
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
C语言稀疏矩阵三元加法实现可以分为以下几个步骤: 1. 定义稀疏矩阵三元组结构体,包括行数、列数、非零元素个数和三个数组:行下标数组、列下标数组和值数组。 2. 输入两个稀疏矩阵三元组,分别存储在两个结构体中。 3. 判断两个稀疏矩阵是否可以相加,即行数和列数是否相等。 4. 定义一个新的稀疏矩阵三元组结构体,用于存储相加后的结果。 5. 遍历两个稀疏矩阵的非零元素,将它们对应位置的值相加,并将结果存储在新的结构体中。 6. 如果某个稀疏矩阵还有剩余的非零元素,则将它们直接复制到新的结构体中。 7. 输出新的稀疏矩阵三元组。 以下是C语言稀疏矩阵三元加法的示例代码: ``` #include <stdio.h> #define MAXSIZE 100 typedef struct { int row; int col; int val; } Triple; typedef struct { int row; int col; int num; Triple data[MAXSIZE]; } TSMatrix; void CreateMatrix(TSMatrix *M) { int i, j, k, val; printf("请输入矩阵的行数、列数和非零元素个数:\n"); scanf("%d%d%d", &M->row, &M->col, &M->num); printf("请输入矩阵的非零元素:\n"); for (k = 0; k < M->num; k++) { scanf("%d%d%d", &i, &j, &val); M->data[k].row = i; M->data[k].col = j; M->data[k].val = val; } } void AddMatrix(TSMatrix M1, TSMatrix M2, TSMatrix *M) { int i, j, k, p, q; if (M1.row != M2.row || M1.col != M2.col) { printf("两个矩阵无法相加!\n"); return; } M->row = M1.row; M->col = M1.col; k = 0; p = 0; q = 0; while (p < M1.num && q < M2.num) { if (M1.data[p].row < M2.data[q].row || (M1.data[p].row == M2.data[q].row && M1.data[p].col < M2.data[q].col)) { M->data[k] = M1.data[p]; p++; } else if (M1.data[p].row > M2.data[q].row || (M1.data[p].row == M2.data[q].row && M1.data[p].col > M2.data[q].col)) { M->data[k] = M2.data[q]; q++; } else { M->data[k].row = M1.data[p].row; M->data[k].col = M1.data[p].col; M->data[k].val = M1.data[p].val + M2.data[q].val; p++; q++; } k++; } while (p < M1.num) { M->data[k] = M1.data[p]; p++; k++; } while (q < M2.num) { M->data[k] = M2.data[q]; q++; k++; } M->num = k; } void PrintMatrix(TSMatrix M) { int i, j, k; k = 0; for (i = 1; i <= M.row; i++) { for (j = 1; j <= M.col; j++) { if (k < M.num && M.data[k].row == i && M.data[k].col == j) { printf("%d ", M.data[k].val); k++; } else { printf("0 "); } } printf("\n"); } } int main() { TSMatrix M1, M2, M; CreateMatrix(&M1); CreateMatrix(&M2); AddMatrix(M1, M2, &M); printf("矩阵相加的结果为:\n"); PrintMatrix(M); return 0; } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值