稀疏矩阵的运算——矩阵相加

这篇具有很好参考价值的文章主要介绍了稀疏矩阵的运算——矩阵相加。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

南昌航空大学实验报告

课程名称:   数据结构A   实验名称:       实验五    稀疏矩阵运算       

班   级:     XXX           学生姓名:      XXX         学号:     XXXXX      

指导教师评定:      XXX     签    名:      XXX    

一、实验目的

数组是一种常用的数据类型,本实验是有关两个稀疏矩阵进行相加的应用。

通过对本实验的学习,可以理解矩阵的相关操作方法。

二、实验内容

在本实验的实例程序中,假设两个稀疏矩阵A和B,它们均为m行n列,要求编写求矩阵的加法即C=A+B的算法(C矩阵存放A与B相加的结果)。

三、程序分析

我们利用一维数组来存储。一维数组顺序存放非零元素的行号、列号和数值,行号-1作为结束标志。然后在进行矩阵加法运算时依次扫描矩阵A和B的行列值,并以行优先。当行列相同时,将第三个元素值相加的和以及行列号三个元素存入结果数组C中;不相同时,将A或B的三个元素直接存入结果数组中。

四、程序源代码

过程见后续,不想看过程的直接拉到底即可。

编写准备

首先,看一下稀疏矩阵的概念:

稀疏矩阵(Sparse Matrix):对于稀疏矩阵,目前还没有一个确切的定义。设矩阵A是一个n´m的矩阵中有s个非零元素,设  δ=s/(n´m),称δ为稀疏因子,如果某一矩阵的稀疏因子δ满足δ≦0.05时称为稀疏矩阵。

简单说就是一个有大量元素为ling3的数组。

以及矩阵相加

一般是指在两个相同大小的矩阵,把其相对应元素加在一起的运算。

然后审查题目。

再程序分析中的“当行列相同时,将第三个元素值相加的和以及行列号三个元素存入结果数组C中;不相同时,将A或B的三个元素直接存入结果数组中。”这句话是编写的中心思想。

设计过程

定义部分

简单介绍一下

对于稀疏矩阵,采用压缩存储方法时,只存储非0元素。必须存储非0元素的行下标值、列下标值、元素值。因此,一个三元组(i, j, aij)唯一确定稀疏矩阵的一个非零元素。

三元组顺序表相应的数据结构定义如下:

//⑴ 三元组结点定义   
#define MAX_SIZE 101
typedef struct
{
    int row;//行下标
    int col;//列下标
    ElemType value;//元素值
}Triple;
//⑵  三元组顺序表定义
typedef struct
{
    int m;//行数
    int n;//列数
    int t;//非0元素个数
    Triple data[MAX_SIZE];
}TMatrix;

没有什么可更改的地方,直接拿来即可。

创建矩阵

直接上代码

void create_matrix(TMatrix &s,int M,int N)//矩阵创建
{
    s.m=M;s.n=N;
    printf("输入非0元素的个数:");
    scanf("%d",&s.t);
    for(int i=1;i<=s.t;i++)
    {
        printf("输入第%d个非0元素的行数、列数以及数值:",i);
        scanf("%d%d%d",&s.data[i].row,&s.data[i].col,&s.data[i].value);
    }
}

M代表矩阵行数,N代表列数。

先输入非0元素的个数,然后依次输入非0元素即可。

矩阵显示

因为输入的是非零元素组成的矩阵,这里将其变换为普通的矩阵,方便观察现象。

void disp_matrix(TMatrix s)//矩阵显示
{
    ElemType A[(s.m)+1][(s.n)+1]={0};//定义二维数组,并使初始值均为0
    for(int temp=1;temp<=s.t;temp++)//非0元素进入数组
        A[s.data[temp].row][s.data[temp].col]=s.data[temp].value;
    for(int i=1;i<=s.m;i++)//显示完整的矩阵
    {
        for(int j=1;j<=s.n;j++)
            printf(" %d",A[i][j]);
        printf("\n");
    }
}

定义二维数组时(ElemType A[(s.m)+1][(s.n)+1]={0};)由于是从0开始计的,而创建函数是从1开始计的,为保持统一。

然后复刻非零元素即可。

最后输出。

矩阵相加函数

void add_matrix(TMatrix a,TMatrix b,TMatrix &c)//矩阵相加
{
    int temp=1;
    c.m=a.m;c.n=a.n;
    c.t=0;
    for(int i=1;i<=a.t;)
        for(int j=1;j<=b.t;)
        {
            if(a.data[i].row>b.data[j].row)
            {
                c.data[temp].row=b.data[j].row;
                c.data[temp].col=b.data[j].col;
                c.data[temp].value=b.data[j].value;//小的给到c
                c.t++;//非零元素加一
                temp++;j++;
            }
            else if(a.data[i].row<b.data[j].row)
            {
                c.data[temp].row=a.data[i].row;
                c.data[temp].col=a.data[i].col;
                c.data[temp].value=a.data[i].value;//小的给到c
                c.t++;//非零元素加一
                temp++;i++;
            }
            else //行号相等
            {
                if(a.data[i].col>b.data[j].col)
                {
                    c.data[temp].row=b.data[j].row;
                    c.data[temp].col=b.data[j].col;
                    c.data[temp].value=b.data[j].value;//小的给到c
                    c.t++;//非零元素加一
                    temp++;j++;
                }
                else if(a.data[i].col<b.data[j].col)
                {
                    c.data[temp].row=a.data[i].row;
                    c.data[temp].col=a.data[i].col;
                    c.data[temp].value=a.data[i].value;//小的给到c
                    c.t++;//非零元素加一
                    temp++;i++;
                }
                else //列号也相等
                {
                    c.data[temp].row=a.data[i].row;
                    c.data[temp].col=a.data[i].col;
                    c.data[temp].value=a.data[i].value+b.data[j].value;//加和并给到c
                    c.t++;//非零元素加一
                    temp++;i++;j++;
                }
            }
        }
}

拿出程序分析中的“当行列相同时,将第三个元素值相加的和以及行列号三个元素存入结果数组C中;不相同时,将A或B的三个元素直接存入结果数组中。”。要对比行列。

如果矩阵a和b同一位置上都有非零元素,则相加。

反之则直接给到c。

实现起来的话,先判断a和b的非零元素的行数,小的那个给到c,然后跳到下一元素。(如b的非零元素的行数小,则将b的非零元素的行、列和值给到c,然后跳到b的下一非零元素)。

然后再判断列数。

如若行数和列数都相等,将a的非零元素的值和b的相加,再给到c即可。

最后是主函数

int main()
{
    TMatrix a,b,c;
    int M,N;//m:行数 n:列数
    printf("输入矩阵行数:");scanf("%d",&M);
    printf("输入矩阵列数:");scanf("%d",&N);
    printf("创建矩阵a:");create_matrix(a,M,N);
    printf("完整的矩阵a:\n");disp_matrix(a);
    printf("创建矩阵b:");create_matrix(b,M,N);
    printf("完整的矩阵b:\n");disp_matrix(b);
    add_matrix(a,b,c);

    printf("非零元素矩阵c:非零元素共有%d个\n行下标 列下标 元素值\n",c.t);
    for(int i=1;i<=c.t;i++)
        printf("  %d      %d      %d\n",c.data[i].row,c.data[i].col,c.data[i].value);

    printf("完整的矩阵c:\n");disp_matrix(c);
    return 0;
}

源代码:

#include<stdio.h>
#include<stdlib.h>
#define ElemType int
#define MAX_SIZE 101
typedef struct
{
    int row;//行下标
    int col;//列下标
    ElemType value;//元素值
}Triple;
typedef struct
{
    int m;//行数
    int n;//列数
    int t;//非0元素个数
    Triple data[MAX_SIZE];
}TMatrix;
void create_matrix(TMatrix &s,int M,int N)//矩阵创建
{
    s.m=M;s.n=N;
    printf("输入非0元素的个数:");
    scanf("%d",&s.t);
    for(int i=1;i<=s.t;i++)
    {
        printf("输入第%d个非0元素的行数、列数以及数值:",i);
        scanf("%d%d%d",&s.data[i].row,&s.data[i].col,&s.data[i].value);
    }
}
void add_matrix(TMatrix a,TMatrix b,TMatrix &c)//矩阵相加
{
    int temp=1;
    c.m=a.m;c.n=a.n;
    c.t=0;
    for(int i=1;i<=a.t;)
        for(int j=1;j<=b.t;)
        {
            if(a.data[i].row>b.data[j].row)
            {
                c.data[temp].row=b.data[j].row;
                c.data[temp].col=b.data[j].col;
                c.data[temp].value=b.data[j].value;//小的给到c
                c.t++;//非零元素加一
                temp++;j++;
            }
            else if(a.data[i].row<b.data[j].row)
            {
                c.data[temp].row=a.data[i].row;
                c.data[temp].col=a.data[i].col;
                c.data[temp].value=a.data[i].value;//小的给到c
                c.t++;//非零元素加一
                temp++;i++;
            }
            else //行号相等
            {
                if(a.data[i].col>b.data[j].col)
                {
                    c.data[temp].row=b.data[j].row;
                    c.data[temp].col=b.data[j].col;
                    c.data[temp].value=b.data[j].value;//小的给到c
                    c.t++;//非零元素加一
                    temp++;j++;
                }
                else if(a.data[i].col<b.data[j].col)
                {
                    c.data[temp].row=a.data[i].row;
                    c.data[temp].col=a.data[i].col;
                    c.data[temp].value=a.data[i].value;//小的给到c
                    c.t++;//非零元素加一
                    temp++;i++;
                }
                else //列号也相等
                {
                    c.data[temp].row=a.data[i].row;
                    c.data[temp].col=a.data[i].col;
                    c.data[temp].value=a.data[i].value+b.data[j].value;//加和并给到c
                    c.t++;//非零元素加一
                    temp++;i++;j++;
                }
            }
        }
}
void disp_matrix(TMatrix s)//矩阵显示
{
    ElemType A[(s.m)+1][(s.n)+1]={0};//定义二维数组,并使初始值均为0
    for(int temp=1;temp<=s.t;temp++)//非0元素进入数组
        A[s.data[temp].row][s.data[temp].col]=s.data[temp].value;
    for(int i=1;i<=s.m;i++)//显示完整的矩阵
    {
        for(int j=1;j<=s.n;j++)
            printf(" %d",A[i][j]);
        printf("\n");
    }
}
int main()
{
    TMatrix a,b,c;
    int M,N;//m:行数 n:列数
    printf("输入矩阵行数:");scanf("%d",&M);
    printf("输入矩阵列数:");scanf("%d",&N);
    printf("创建矩阵a:");create_matrix(a,M,N);
    printf("完整的矩阵a:\n");disp_matrix(a);
    printf("创建矩阵b:");create_matrix(b,M,N);
    printf("完整的矩阵b:\n");disp_matrix(b);
    add_matrix(a,b,c);

    printf("非零元素矩阵c:非零元素共有%d个\n行下标 列下标 元素值\n",c.t);
    for(int i=1;i<=c.t;i++)
        printf("  %d      %d      %d\n",c.data[i].row,c.data[i].col,c.data[i].value);

    printf("完整的矩阵c:\n");disp_matrix(c);
    return 0;
}

运行结果:

稀疏矩阵加法,数据结构,矩阵文章来源地址https://www.toymoban.com/news/detail-780247.html

到了这里,关于稀疏矩阵的运算——矩阵相加的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C++数据结构稀疏矩阵运算(含加减乘及快速转置)

    题目: 内容:稀疏矩阵运算器 要求:使用三元组顺序表存储矩阵;实现矩阵的逆置、加、减、乘运算;具有相应的报错处理。 本人采用C++来书写该数据结构的题目,有兴趣的同学可以了解一下需要掌握一定的封装的能力。 类的结果存储如下所示: 加减法的函数内容如下所

    2023年04月10日
    浏览(28)
  • 数据结构第七周 :(稀疏矩阵快速转置 + 简单文本编辑器 + 三元组的矩阵加法 + 九宫格数独游戏 + 数组主元素 + 螺旋数字矩阵 + 蛇形矩阵)

    【问题描述】 稀疏矩阵的存储不宜用二维数组存储每个元素,那样的话会浪费很多的存储空间。所以可以使用一个一维数组存储其中的非零元素。这个一维数组的元素类型是一个三元组,由非零元素在该稀疏矩阵中的位置(行号和列号对)以及该元组的值构成。而矩阵转置就

    2023年04月21日
    浏览(32)
  • 稀疏矩阵的运算——矩阵相加

    南昌航空大学实验报告 课程名称:    数据结构A   实验名称:        实验五    稀疏矩阵运算        班   级:      XXX           学生姓名:       XXX         学号:      XXXXX       指导教师评定:       XXX     签    名:       XXX    

    2024年02月03日
    浏览(32)
  • 【数据结构】15 队列应用实例:多项式加法运算

    我们准备采用不带头节点的单向链表结构表示一元多项式,并按照指数递减的顺序排列各项。 对列表存放的两个多项式进行加法运算时,可以使用两个指针p1和p2。初始时的p1和p2分别指向这两个多项式第1个节点(指数的最高项)。通过循环不断比较p1和p2所指的节点,比较结

    2024年02月21日
    浏览(29)
  • 数据结构— 数组、特殊矩阵、稀疏矩阵

    💟作者简介:大家好呀!我是 路遥叶子 ,大家可以叫我 叶子 哦! ❣️     📝个人主页:【路遥叶子的博客】 🏆博主信息: 四季轮换叶 , 一路招摇胜!      专栏 【数据结构-Java语言描述】  【安利Java零基础】 🐋希望大家多多支持😘一起进步呀!~❤️ 🌈若有帮助

    2024年02月02日
    浏览(41)
  • R语言lasso惩罚稀疏加法(相加)模型SPAM拟合非线性数据和可视化

    本文将关注R语言中的LASSO(Least Absolute Shrinkage and Selection Operator)惩罚稀疏加法模型(Sparse Additive Model,简称SPAM)。SPAM是一种用于拟合非线性数据的强大工具,它可以通过估计非线性函数的加法组件来捕捉输入变量与响应变量之间的复杂关系 ( 点击文末“阅读原文”获取完

    2024年02月11日
    浏览(30)
  • 数据结构——稀疏矩阵

    在矩阵中,若数据为0的元素数目远远多于非0元素的数目,并且非0元素分布没有规律时,则称该矩阵为稀疏矩阵;与之相反的叫做稠密矩阵。 将棋盘看作一个二维数组,在棋子落盘时,要记录该棋子落下的坐标,其他坐标的值不做记录,默认为0。由于记录很多无意义的数据

    2024年02月03日
    浏览(29)
  • 【开卷数据结构 】稀疏矩阵

    🌺稀疏矩阵 🍁矩阵与稀疏矩阵的定义 🌺稀疏矩阵的转置 🍁详细思路 🍀思路一 🍀思路二 🌺稀疏矩阵的乘法 🍁详细思路 Q:什么是矩阵 A: 数学上,一个 矩阵 由 m 行 n 列的元素组成,是一个 m 行,n 列的表,m 和 n 是矩阵的 维度 。一般地,写作 mxn(读作“m乘n”)来指

    2024年01月19日
    浏览(29)
  • 【数据结构】数组(稀疏矩阵、特殊矩阵压缩、矩阵存储、稀疏矩阵的快速转置、十字链表)

    前几期期链接: 【数据结构】栈与队列的概念和基本操作代码实现 【数据结构】树与二叉树的概念与基本操作代码实现 k维数组的定义: k 维数组 D = { a j 1 , j 2 , . . . , j k } k维数组D={ a_{j_1, j_2, ..., j_k} } k 维数组 D = { a j 1 ​ , j 2 ​ , ... , j k ​ ​ } k 0 称为数组的维数,

    2024年04月09日
    浏览(126)
  • 浙大数据结构第二周02-线性结构2 一元多项式的乘法与加法运算

    设计函数分别求两个一元多项式的乘积与和。 输入格式: 输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。 输出格式: 输出分2行,分别以指数递降方式输出乘积多项式

    2024年02月13日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包