稀疏矩阵

稀疏矩阵三元组模板

匿名 (未验证) 提交于 2019-12-03 00:34:01
稀疏矩阵三元顺序组模板 typedef struct { int i,j; int elem; }Triple;//一个点的三元组。 typedef struct { Triple Data[MAXN]; int m,n,len; //m,n记录的是这个矩阵的行与列;但本题没用到整个矩阵的行与列,因为是稀疏矩阵 }TripleMatrix; //一个矩阵的三元组 稀疏矩阵三元顺序组的创建 void CreateTriple(TripleMatrix *p,int n) //因为有->,所以用指针传方便 { int cnt; for(cnt=0;cnt<n;cnt++) //i从0开始,是因为addtriple这个函数while跳出的小于号决定的 { scanf("%d%d%d",&p->Data[cnt].i,&p->Data[cnt].j,&p->Data[cnt].elem); //因为不是链表存储结构,所以不用malloc构建空间 } p->len=cnt; //for里不要再习惯i了 } 稀疏矩阵三元组顺序的相加 void AddTriple(TripleMatrix *a,TripleMatrix *b,TripleMatrix *c) { int k,l; int temp; c->len=0; k=0,l=0; while(k<(a->len)&&l<(b->len)

行逻辑三元组稀疏矩阵加减乘的编程实现

匿名 (未验证) 提交于 2019-12-03 00:22:01
目的: 编程实现稀疏矩阵的四则运算。 实现: 1. 稀疏矩阵的存储结构采用行逻辑表示的三元组 2. # define MAXSIZE 12500 # define MAXRC 12500 typedef struct { int i , j ; int e ; } Triple ; typedef struct { Triple data [ MAXSIZE + 1 ]; int rpos [ MAXRC + 1 ]; int mu , nu , tu ; } RLSMatrix ; 先通过创建mu nu tu的值再根据这些值采用循环输入得到data,之后再通过扫描确定rpos的值则可以完成创建。 通过三元组的形式将非零元对应的行列以及数值存储下来,再由稀疏矩阵结构存下矩阵的行数列数以及非零元个数,即可囊括稀疏矩阵的所有信息。这样就可以以三元组的形式把矩阵非零元素存储下来,节省了存储量的同时便于矩阵运算。 矩阵的加法 根据矩阵的相关知识,两个矩阵相加要求两个矩阵的行数,列数要相等。故需要设置判断是否满足矩阵相加的条件。若满足条件,则进行加法运算。根据矩阵加法法则,得到的新矩阵拥有与原来两矩阵相同的行数和列数,其元素数值则为两矩阵对应位置的元素值之和。 矩阵的减法 和加法相同地根据三种情况采用三个循环处理对应的数据,只不过两个都有的情况结果要变为两者之差

稀疏矩阵――三元组顺序表

匿名 (未验证) 提交于 2019-12-03 00:15:02
Ŀ¼ 假设m n的矩阵中,有t的非零元,令s=t/m n,当,s<=0.05时,称此矩阵为稀疏矩阵,简单理解就是非零元特别少的矩阵 //一般矩阵a 1 2 3 a= 4 5 6 7 8 9 //稀疏矩阵s 0 0 0 0 0 0 2 0 0 5 s= 0 0 3 0 0 0 0 0 0 4 一个m * n的矩阵转置后变为 n * m的矩阵 //3*2的矩阵-转置前 1 2 4 5 7 8 //转置后变为2*3 1 4 7 2 5 8 转置后的矩阵每个元素的下表与原来的下表刚好相反,例如上面4转置前的下标为(2,1),转置后变为(1,2); 之所以引入三元组顺序表,是因为,对于稀疏矩阵而言,用传统的存储方法会造成存储空间的浪费 0 12 9 0 0 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 14 0 M= 0 0 24 0 0 0 0 0 18 0 0 0 0 0 15 0 0 -7 0 0 0 //上面矩阵用三元组表示 i j v 1 2 12 1 3 9 3 1 -3 3 6 14 4 3 24 5 2 18 6 1 15 6 4 -7 typedef struct { int i,j; //行坐标、列坐标 ElemType e; //元素 }Triple; typedef struct { Triple date[MAXSIZE+1]; //0不存储元素 int

稀疏矩阵——三元组顺序表

心不动则不痛 提交于 2019-12-02 16:32:46
目录 稀疏矩阵 矩阵的转置 矩阵压缩存储-三元组顺序表 稀疏矩阵的转置 第一种:以列序为主序的转置 第二种:快速转置 完整代码: 稀疏矩阵 假设m n的矩阵中,有t的非零元,令s=t/m n,当,s<=0.05时,称此矩阵为稀疏矩阵,简单理解就是非零元特别少的矩阵 //一般矩阵a 1 2 3 a= 4 5 6 7 8 9 //稀疏矩阵s 0 0 0 0 0 0 2 0 0 5 s= 0 0 3 0 0 0 0 0 0 4 矩阵的转置 一个m * n的矩阵转置后变为 n * m的矩阵 //3*2的矩阵-转置前 1 2 4 5 7 8 //转置后变为2*3 1 4 7 2 5 8 转置后的矩阵每个元素的下表与原来的下表刚好相反,例如上面4转置前的下标为(2,1),转置后变为(1,2); 矩阵压缩存储-三元组顺序表 之所以引入三元组顺序表,是因为,对于稀疏矩阵而言,用传统的存储方法会造成存储空间的浪费 0 12 9 0 0 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 14 0 M= 0 0 24 0 0 0 0 0 18 0 0 0 0 0 15 0 0 -7 0 0 0 //上面矩阵用三元组表示 i j v 1 2 12 1 3 9 3 1 -3 3 6 14 4 3 24 5 2 18 6 1 15 6 4 -7 typedef struct { int i,j; /

稀疏矩阵计算器(三元组实现矩阵加减乘法)

回眸只為那壹抹淺笑 提交于 2019-12-02 09:05:38
一、问题描述: 稀疏矩阵是指那些多数元素为零的矩阵。利用“稀疏”特点进行存储(只存储非零元)和计算可以大大节省存储空间,提高计算效率。实现一个能进行稀疏矩阵基本运算的运算器。 二、需求分析: 以“带行逻辑链接信息”的三元组顺序表表示稀疏矩阵,实现两个矩阵相加、相减和相乘的运算。稀疏矩阵的输入形式采用三元组表示,而运算结果的矩阵则以通常的阵列形式列出。稀疏矩阵的输出要求:矩阵的行数、列数、非零元个数,以及详细的矩阵阵列形式。 三、代码实现 #include <stdio.h> #include <iostream> #define ERROR -1 #define MAXSIZE 12500 //非零元个数最大值MAXSIZE #define MAXRC 21 //各行第一个非零元位置最大值MAXRC #define OK 1 typedef int ElemType; typedef struct //同课本P98 { int i,j; ElemType e; } Triple; typedef struct //同课本P100 { Triple data[MAXSIZE+1]; //非零元三元组表 int rpos[MAXRC+1]; //各行第一个非零元的位置表 int mu,nu,tu; //矩阵的行数、列数和非零元个数 } RLSMatrix; void

采用十字链表存储的稀疏矩阵

只愿长相守 提交于 2019-12-01 07:30:56
Description 当矩阵的非零元个数和位置在操作过程中变化较大时,就不宜采用顺序存储的结构来表示三元组的线性表了。因此,在这种情况下,采用链式存储结构表示三元组更为恰当。十字链表就是能够实现这样功能的一种数据结构。 在十字链表中,每个非零元可以用一个包含5个域的结点表示。其中i、j和e这3个域分别表示该非零元所在的行、列和非零元的值,向右域right用来链接同一行中下一个非零元,而向下域down用来链接同一列中下一个非零元。同一行的非零元通过right域链接成一个线性链表,同一列的非零元通过down域链接成一个线性链表。每个非零元既是某个行链表中的一个结点,又是某个列链表中的一个结点,整个矩阵通过这样的结构形成了一个十字交叉的链表。 稀疏矩阵的十字链表类型可以描述如下: 下面是建立稀疏矩阵十字链表的算法描述: 给出一个稀疏矩阵,请将其存储到一个十字链表中,并将存储完毕的矩阵输出。 Input 输入的第一行是两个整数r和c(r<200, c<200, r*c <= 12500),分别表示一个包含很多0的稀疏矩阵的行数和列数。接下来有r行,每行有c个整数,用空格隔开,表示稀疏矩阵的各个元素。 Output 输出读入的矩阵。输出共有r行,每行有c个整数,每个整数后输出一个空格。请注意行尾输出换行。 Sample Input 5 6 0 18 0 0 0 0 0 0 67 0 0 0

稀疏矩阵转置+快速转置

风格不统一 提交于 2019-12-01 07:28:23
稀疏矩阵转置 Description 稀疏矩阵的存储不宜用二维数组存储每个元素,那样的话会浪费很多的存储空间。所以可以使用一个一维数组存储其中的非零元素。这个一维数组的元素类型是一个三元组,由非零元素在该稀疏矩阵中的位置(行号和列号对)以及该元组的值构成。 矩阵转置就是将矩阵行和列上的元素对换。 现在就请你对一个稀疏矩阵进行转置。以下是稀疏矩阵转置的算法描述: 图:稀疏矩阵转置的算法描述 Input 输入的第一行是两个整数r和c(r*c <= 12500),分别表示一个包含很多0的稀疏矩阵的行数和列数。接下来有r行,每行有c个整数,表示这个稀疏矩阵的各个元素。 Output 输出c行,每行有r个整数,每个整数后跟一个空格。该结果为输入稀疏矩阵的转置矩阵。 Sample Input 6 7 0 12 9 0 0 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 14 0 0 0 24 0 0 0 0 0 18 0 0 0 0 0 15 0 0 -7 0 0 0 Sample Output 0 0 -3 0 0 15 12 0 0 0 18 0 9 0 0 24 0 0 0 0 0 0 0 -7 0 0 0 0 0 0 0 0 14 0 0 0 0 0 0 0 0 0 HINT 提示: 严老师纸质书中用 union 类型来表示稀疏矩阵类型,这是有问题的,应该使用 struct

行逻辑链接的矩阵乘法

我怕爱的太早我们不能终老 提交于 2019-12-01 07:28:12
Description 对于一个稀疏矩阵,当需要频繁的随机存取任意一行的非零元时,则需要知道每一行的第一个非零元在三元组表中的位置。为此,可以将算法5.2中用来指示“行”信息的辅助数组cpot固定在稀疏矩阵的存储结构中。这种“带行链接信息”的三元组表即为行逻辑链接的顺序表。其类型描述如下: 针对存储于行逻辑链接顺序表的稀疏矩阵,其矩阵相乘的算法与经典算法有所不同。因此,对于两个稀疏矩阵相乘(Q=M×N)的过程可以大致描述如下: 请使用行逻辑链接的顺序表实现两个稀疏矩阵的乘法。 Input 输入的第一行是两个整数r1和c1(r1<200, c1<200, r1*c1 <= 12500),分别表示一个包含很多0的稀疏矩阵的行数和列数。接下来有r1行,每行有c1个整数,用空格隔开,表示第一个稀疏矩阵的各个元素。 之后的一行有两个整数r2和c2(c1=r2<200, c2<200, r2*c2 <= 12500),分别表示一个包含很多0的稀疏矩阵的行数和列数。接下来有r2行,每行有c2个整数,用空格隔开,表示第二个稀疏矩阵的各个元素。 Output 输出两个矩阵的乘积。输出共有r1行,每行有c2个整数,每个整数后输出一个空格。请注意行尾输出换行。 Sample Input 4 5 0 0 0 69 78 0 0 5 0 0 0 0 0 0 0 0 91 2 0 82 5 6 0 18 0

对称矩阵及稀疏矩阵浅谈

时光怂恿深爱的人放手 提交于 2019-11-30 13:11:12
1.对称矩阵 特点: 关于对角线对称,Aij == Aji。 下面实现: ①对称矩阵的压缩存储 ②对称矩阵的访问 ③对称矩阵的还原 实现代码如下: #define _CRT_SECURE_NO_WARNINGS 1 #include<iostream> using namespace std ; //对称矩阵的压缩存储 template < class T> class SymmetricMatrix { public : SymmetricMatrix(T* array , size_t N) :_N(N) ,_a(NULL) { _a = new T[(N * (N + 1 ))>> 1 ]; for (size_t i = 0 ; i < N; ++i) { for (size_t j = 0 ; j < N; ++j) { if (i >= j) //表明是下三角数据时 { _a[(i * (i + 1 ))>> 1 + j] = array [i * N + j]; } else { break ; } } } } T& Access(size_t x, size_t y) { if (x < y) //如果访问上三角元素 { swap(x, y); } return _a[(x * (x + 1 )) >> 1 + y]; } void DisPlay() { for

Python 的稀疏矩阵

六月ゝ 毕业季﹏ 提交于 2019-11-29 06:23:49
  什么是稀疏矩阵   简单的说,如果一个矩阵中大部分元素为0,就被称为稀疏矩阵。   对于稀疏矩阵而言,实际存储的数据项很少。如果在计算机中采用传统的二维数组(Python中用二维列表)来存储稀疏矩阵,就会浪费大量的内存空间来存储0。比如一个10000 X 10000的稀疏矩阵,只有一个元素非0,若采用传统的存储技术,将浪费太多的内存来存储无意义的0。   稀疏矩阵的存储   对于稀疏矩阵,我们只需要记住矩阵中非0元素的位置和值、以及系数矩阵的大小(行数和列数)这些有用信息即可。也就是说,我们可以用一个包含3列的二维数组存储稀疏矩阵中的非0项,记录非0项的所在行、所在列和值信息以及记录稀疏矩阵行数和列数信息。   例如对于下面的3X3稀疏矩阵:   0  0  0   0  0  0   3  0  7   我们用下面的压缩矩阵来存储稀疏矩阵:   3   3  2   2  0  3   2  2  7   上面的压缩矩阵中,第0行(也就是标黄的部分)存储稀疏矩阵的行数(3)、列数(3)和非0项数据的个数(2)。   从第1行开始,存储非0项所在的行数、所在的列数和值。每一行存储一个非0项的信息。   示例题目   题目描述   输入一个稀疏矩阵,打印稀疏矩阵和压缩后的结果。   输入/输出描述   输入描述:   输入矩阵的行数和列数,在输入每一个位置对应的值。