首页 > 编程语言 >数据结构三元顺序表稀疏矩阵的加法程序

数据结构三元顺序表稀疏矩阵的加法程序

时间:2023-11-07 21:24:00浏览次数:150  
标签:元素 矩阵 稀疏 三元组 加法 数据结构 data

三元顺序表稀疏矩阵的加法

三元顺序表是什么?稀疏矩阵又是什么?稀疏矩阵的加法和普通矩阵的加法有什么不同?你看到这些是不是都有些困惑。那么现在我们就来讲讲这些陌生的东西。
  • 三元顺序表

将稀疏矩阵非零元素对应的三元组所构成的集合,按照行优先的顺序排列成一个线性表,毫无疑问,这是需要定义一个结构体
struct Node {
     int row, col, elem; //分别表示行号,列号,非零元素具体数值
}
  • 稀疏矩阵

矩阵中有许多的0元素,并且没有分布规律。注意,稀疏矩阵并不是特殊矩阵,而我们所知道的特殊矩阵(上、下)三角矩阵、对称矩阵、对角矩阵等等。
  • 稀疏矩阵的加法

稀疏矩阵的加法和普通矩阵的加法并没有特别之处。但利用三元组顺序表来实现加法运算有着不同的逻辑思维。下面我们来看看三元组顺序表稀疏矩阵的加法算法。
对于A和B都是3*3的稀疏矩阵,我们用(行、列、非零元素的具体值)这种形式来输入输出。对于A的第i个非零元素的行(或列)与B的第j个非零元素的行(或列)有一种大小关系,且A、B的非零元素的个数不一定相同。这些是我们所需要知道的。接下来就是如何实现我们的算法了。
I.我们从矩阵的行比较开始说起。当行相同时,我们就比较列,矩阵的列可能相同可能不相同,还有可能相同,那么我们以以来说一说。
(1)当矩阵的列相同时,新矩阵C的三元组顺序表的行、列就会等于矩阵A(或矩阵B)的行、列,C的非零元素具体值就等于A的具体值加B的具体值。然后A、B、C的三元组顺序表都加加。
(2)当矩阵A的列<矩阵B的列时,C的列就等于A的列,也就是等于列较小的矩阵的列。C的非零元素具体值等于A的非零元素具体值。C的行等于A的行,最后A、C的三元组顺序表加加。
(3)当A的列>B的列时,与(2)类似,这里不在赘述。
II.当A、B的行不相同时,则就是大、小关系。我们就说一种,A的行<B的行时的情况。
这种情况下,直接将A的行、列、非零元素具体值赋给C,同时A、C的三元组顺序表都加加。
III.处上述列举的可能,是不是还有可能A(或B)的非零元素有剩余,没有赋给C,那么这里我们就说一说A有剩余的情况。(B剩余的情况和A类似,不再赘述)
这种情况下,直接把A所剩余的非零元素全部赋给C。
下面我们来看代码:
int i=1,j=1,count=1;
	while(i<=A.tu&&j<=B.tu){
		if(A.data[i].row==B.data[j].row){			//矩阵A当前元素行号等于矩阵B当前元素行号 
			if(A.data[i].col==B.data[j].col){		//矩阵A当前元素列号等于矩阵B当前元素列号 
				C.data[count]=A.data[i];
				C.data[count].elem+=B.data[j].elem;
				++i;++j;++count;
			}else if(A.data[i].col<B.data[j].col){	//矩阵A当前元素列号小于矩阵B当前元素列号 
				C.data[count]=A.data[i];
				++i;++count;
			}else if(A.data[i].col>B.data[j].col){	//矩阵A当前元素列号大于矩阵B当前元素列号 
				C.data[count]=B.data[j];
				++j;++count;
			}
		}else if(A.data[i].row<B.data[j].row){		//矩阵A当前元素行号小于矩阵B当前元素行号 
			C.data[count]=A.data[i];
			++i;++count;
		}else if(A.data[i].row>B.data[j].row){		//矩阵A当前元素行号大于矩阵B当前元素行号 
			C.data[count]=B.data[j];
			++j;++count;
		}
	}
	while(i<=A.length){
		C.data[count]=A.data[i];
		++i;++count;
	}
	while(j<=B.length){
		C.data[count]=B.data[j];
		++j;++count;
	}
	C.length=--count;

那么到这里我们的三元组顺序表稀疏矩阵的加法算法就到此结束啦!!!

标签:元素,矩阵,稀疏,三元组,加法,数据结构,data
From: https://www.cnblogs.com/zhzbubai/p/17815687.html

相关文章

  • Scipy中稀疏矩阵用法解析(sp.csr_matrix;sp.csc_matrix;sp.coo_matrix)用法
    参考:链接orig=np.array([[1,0,2],[0,0,3],[4,7,6]])aa=csr_matrix(orig)aa有如下属性:#2代表第第一行有2个不为零的元素,#3代表第第一和二行不为零的元素总共有3个#6代表第第一、二和三行不为零的元素总共有6个indptr:array([0,2,3......
  • 满秩矩阵
    单位阵:单位阵是单位矩阵的简称,它指的是对角线上都是1,其余元素皆为0的矩阵。在矩阵的乘法中,有一种矩阵起着特殊的作用,如同数的乘法中的1,我们称这种矩阵为单位矩阵,简称单位阵。它是个方阵,除左上角到右下角的对角线(称为主对角线)上的元素均为1以外全都为0。可用将系数矩......
  • python初学者学习笔记-第三章-数据结构
    chapter3/数据结构3.1列表(List)序列是Python中最基本的数据结构,最常见的序列是列表和元组。序列中的每个元素都分配一个索引,第一个索引是0,第二个索引是1,依此类推。序列都可以进行如下操作,包括:索引,切片,加,乘,查询。Python中可以通过组合一些值得到多种复合数据类型。其中最常......
  • 海森矩阵 Hessian matrix
    二阶偏导数矩阵也就所谓的赫氏矩阵(Hessianmatrix).一元函数就是二阶导,多元函数就是二阶偏导组成的矩阵.求向量函数最小值时用的,矩阵正定是最小值存在的充分条件。经济学中常常遇到求最优的问题,目标函数是多元非线性函数的极值问题尚无一般的求解方法,但判定局部极小值......
  • 数据结构与算法-栈
    什么是栈 栈是一种“操作受限”的线性表,只允许在一端插入和删除数据。相比数组和链表,栈带给我的只有限制,并没有任何优势。那我直接使用数组或者链表不就好了吗?为什么还要用这个“操作受限”的“栈”呢?从功能上来说,数组或链表确实可以替代栈,但你要知道,特定的数据结构是对特定......
  • 《数据结构》概念复习一
    1.考前必背的知识点(干货)数据(Data):数据是描述客观事物的数值,字符以及能输入到计算机中且能被处理的各种符号集合。数据元素(DataElement):数据元素是组成数据的基本单位,是数据集合的个体,在数据结构中作为一个整体进行考虑和处理,一个数据元素由多个数据项构成数据对象(DataObject):......
  • 矩阵哈希
    矩阵哈希矩阵哈希可以解决一系列消消乐问题,即:​ 给定一个序列\(A\),每次可以消除相邻相同两项,问是否可以消除完。这一类问题。做法我们对每个字符\(c\)随机一个矩阵\(M_c\),那么当出现奇数次的时候乘\(M_c\),出现偶数次的时候乘他的逆\(M_c^{-1}\)。那么当一个序列里的......
  • 数据结构-队列和栈
    栈和队列是两种不同的数据形式,区别就是栈是先进后出,但是队列先进先出,可以用数据结构模拟这两种形式。1、队列完整代码如下:#include<stdio.h>#include<stdlib.h>#if0/*顺序队列*/intenQueue(int*a,intrear,intdata){a[rear]=data;rear++;retur......
  • 数据结构-链表2
    1、静态链表这个给我的感觉就是数组加了索引,它的目的就是要融合顺序表和链表的优点,能够快速的访问元素,也能快速的增加或删除元素。整个的组成如图所示,第一列的数据是位置,第二列是数据2、双向链表双向链表概念是区别于单链表而言的,就是多了一个前驱,组成示意图如下所示:常见结......
  • 数据结构-队列
    一、概念1、队列的定义队列是仅限在一端进行插入,另一端进行删除的线性表。队列又被称为先进先出(FirstInFirstOut)的线性表,简称FIFO。2、队首允许进行元素删除的一端称为队首3、队尾允许进行元素插入的一端称为队尾二、接口1、可写接口(1)数据入队队列的插入操作,叫做入队。它是......