前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >稀疏矩阵及其实现

稀疏矩阵及其实现

作者头像
李志伟
发布2019-12-17 17:31:27
5430
发布2019-12-17 17:31:27
举报
文章被收录于专栏:为学为学

稀疏矩阵及其实现

  • 这一节用到了数组的一些知识,和线代中矩阵的计算方法。建议没有基础的读者去看一下矩阵的相关知识。
  • 和之前的博客一样,这次依然参考了严蔚敏的《数据结构(C语言版)》。

稀疏矩阵的预定义

代码语言:javascript
复制
/*--------稀疏矩阵的三元组顺序表存储表示----------*/
typedef int ElemType;

#define MAXSIZE 12500       // 假设非零元个数的最大数值为12500
typedef struct {
    int i, j;               // 该非零元的行下标和列下标
    ElemType e;
}Triple;

typedef struct {
    Triple data[MAXSIZE + 1];
    int mu, nu, tu;         // 矩阵的行数、列数、和非零元个数
}TSMatrix;

/*--------------数据结构定义结束---------------*/

一些基本方法

代码语言:javascript
复制
/*-----------------基本操作-------------------*/

/*创建稀疏矩阵M*/
Status CreateSMatrix(TSMatrix *M){  
    if (!M)return ERROR;        //若空间分配失败,则返回ERROR

    // 让矩阵初始行列数都为0,非零元个数也为0
    M->mu = 0;
    M->nu = 0;
    M->tu = 0;
    return OK;
}

/*销毁稀疏矩阵*/
Status DestroySMatrix(TSMatrix *M){
    free(M);

    if (M)return ERROR;         //若M仍存在,则销毁失败,返回ERROR
    return OK;
}
/*给稀疏矩阵赋值*/
Status Assign(TSMatrix *M){
    int p, q, r, t = 0;

    for (p = 0; p < M->mu; p++){
        for (q = 0; q < M->nu; q++){
            printf_s("[%d][%d] = ", p + 1, q + 1);
            scanf_s("%d", &r);

            if (r != 0){
                t++;
                M->data[t].i = p + 1;
                M->data[t].j = q + 1;
                M->data[t].e = r;
            }
        }
    }

    M->tu = t;
    return OK;
}

/*输出稀疏矩阵*/
void PrintSMatrix(TSMatrix M){
    int m;
    for (m = 1; m <= M.tu; m++){
        printf_s("======[%d][%d] = %d\n", M.data[m].i, M.data[m].j, M.data[m].e);
    }
}

/*由稀疏矩阵M复制得到T*/
Status CopySMatrix(TSMatrix M, TSMatrix *T){
    CreateSMatrix(T);

    if (!T)return ERROR;

    //将M的行列数以及非零元的个数赋给T
    T->mu = M.mu;
    T->nu = M.nu;
    T->tu = M.tu;

    //将M的data数组赋给T
    int m;
    for (m = 1; m < M.tu; m++){
        T->data[m].i = M.data[m].i;
        T->data[m].j = M.data[m].j;
        T->data[m].e = M.data[m].e;
    }

    return OK;
}

/*若稀疏矩阵M与N的行数和列数对应相等,求稀疏矩阵的和Q = M + N*/
Status AddSMatrix(TSMatrix M, TSMatrix N, TSMatrix *Q){
    if (M.mu != N.mu || M.nu != N.nu)return ERROR;      //若行数和列数不对应相等,则返回ERROR

    CreateSMatrix(Q);

    //给Q设置行数和列数
    Q->mu = M.mu;
    Q->nu = M.nu;

    int m, n, q;            //设立m,n,q来计算矩阵元素个数
    m = 1;
    n = 1;
    q = 0;

    while (m < M.tu && n < N.tu){
        if (M.data[m].i == N.data[n].i){
            if (M.data[m].j == N.data[n].j){
                q++;
                Q->data[q].i = M.data[m].i;                 //Q.data[q]的行下标为M.data[m]的行下表
                Q->data[q].j = M.data[m].j;                 //Q.data[q]的列下标为M.data[m]的列下表
                Q->data[q].e = M.data[m].e + N.data[n].e;   //Q.data[q]的数值为两个矩阵对应位置的数值之和

                m++;
                n++;
            }
            else if (M.data[m].j < N.data[n].j){
                q++;
                Q->data[q].i = M.data[m].i;
                Q->data[q].j = M.data[m].j;
                Q->data[q].e = M.data[m].e;

                m++;
            }
            else if (M.data[m].j > N.data[n].j){
                q++;
                Q->data[q].i = N.data[n].i;
                Q->data[q].j = N.data[n].j;
                Q->data[q].e = N.data[n].e;

                n++;
            }
        }
        else if (M.data[m].i < N.data[n].i){
            q++;
            Q->data[q].i = M.data[m].i;
            Q->data[q].j = M.data[m].j;
            Q->data[q].e = M.data[m].e;

            m++;
        }
        else if (M.data[m].i > N.data[n].i){
            q++;
            Q->data[q].i = M.data[m].i;
            Q->data[q].j = M.data[m].j;
            Q->data[q].e = M.data[m].e;

            m++;
        }

    }

    //当有矩阵非零元用完了之后,处理剩下的一个矩阵中的剩余元素
    while (m <= M.tu){
        q++;
        Q->data[q].i = M.data[m].i;
        Q->data[q].j = M.data[m].j;
        Q->data[q].e = M.data[m].e;

        m++;
    }

    while (n <= N.tu){
        q++;
        Q->data[q].i = N.data[n].i;
        Q->data[q].j = N.data[n].j;
        Q->data[q].e = N.data[n].e;

        n++;
    }

    Q->tu = q;
    return OK;
}

/*若稀疏矩阵M与N的行数和列数对应相等,求稀疏矩阵的差 Q = M - N*/
Status SubSMatrix(TSMatrix M, TSMatrix N, TSMatrix *Q){
    //这个方法实际上就是对AddSMatrix(M, -N, Q)的实现
    return OK;
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 稀疏矩阵及其实现
    • 稀疏矩阵的预定义
      • 一些基本方法
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档