两个稀疏矩阵三元组相加
三元组表稀疏矩阵其求和

#include "stdio.h"#define MAXSIZE 100struct node{int i,j;int v;};struct sparmatrix{int rows,cols;int terms;struct node data[MAXSIZE];};void sum(struct sparmatrix a,struct sparmatrix b);main(){int m[MAXSIZE][MAXSIZE],n[MAXSIZE][MAXSIZE];int i,j,mrow,mcol,nrow,ncol,ano=0,bno=0,counter=0,t=0;struct sparmatrix a,b;printf("Please input row and col of matrix m(for example: row,col):"); scanf("%d,%d",&mrow,&mcol);printf("\n");printf("Please input row and col of matrix n(for example: row,col):"); scanf("%d,%d",&nrow,&ncol);if ((mrow!=nrow)||(mcol!=ncol)){printf("ERROR: dimensions of m,n are different!");getch();return; /*comapre dimension between matrix m and n*/ }for (i=0;i<mrow;i++)for (j=0;j<mcol;j++){ printf("input value of data element m[%d][%d] ",i,j);scanf("%d",&m[i][j]);} /*input value of matrix m*/for (i=0;i<nrow;i++)for (j=0;j<ncol;j++){ printf("input value of data element n[%d][%d] ",i,j);scanf("%d",&n[i][j]);} /*input value of matrix n*/printf("matrix m you input as follows:\n");for (i=0;i<mrow;i++)for (j=0;j<mcol;j++){if (t==mcol){printf("\n");t=0;}printf(" %d",m[i][j]);t++;} /*output matrix m*/printf("\n");printf("\n");printf("matrix n you input as follows:\n");t=0;for (i=0;i<nrow;i++)for (j=0;j<ncol;j++){if (t==ncol){printf("\n");t=0;}printf(" %d",n[i][j]);t++;} /*output matrix n*/printf("\n");printf("\n");for (i=0;i<mrow;i++)for (j=0;j<mcol;j++)if (m[i][j]!=0){ counter++;a.data[ano].i=i;a.data[ano].j=j;a.data[ano].v=m[i][j];ano++;}a.rows=mrow;a.cols=mcol;a.terms=counter;printf("tripule node of m: i j v \n");for(i=0;i<a.terms;i++)printf(" %5d %5d %5d\n",a.data[i].i,a.data[i].j,a.data[i].v);counter=0;for (i=0;i<nrow;i++)for (j=0;j<ncol;j++)if (n[i][j]!=0){ counter++;b.data[bno].i=i;b.data[bno].j=j;b.data[bno].v=n[i][j];bno++;}b.rows=nrow;b.cols=ncol;b.terms=counter;printf("tripule node of n: i j v\n");for(i=0;i<b.terms;i++)printf(" %5d %5d %5d\n",b.data[i].i,b.data[i].j,b.data[i].v);sum(a,b);getch();}void sum(struct sparmatrix a,struct sparmatrix b){struct sparmatrix c; /*c为a+b的转置*/int i,j,x,k=0,p=0,cno=0,counter=0,flag=0;int mn[MAXSIZE][MAXSIZE]; /*define variables*/c.cols=a.cols;c.rows=a.rows;if (a.terms==0&&b.terms==0){return ; /*check the numbers of data element that isn't zero*/}for(i=1;i<=c.rows;i++){for(j=1;j<=c.cols;j++){if(a.data[k].i==b.data[p].i)if(a.data[k].j==b.data[p].j){c.data[cno].v=a.data[k].v+b.data[p].v;c.data[cno].i=a.data[k].i;c.data[cno].j=a.data[k].j;cno++;k++;p++;}elseif(a.data[k].j>b.data[p].j){c.data[cno].v=b.data[p].v;c.data[cno].i=b.data[p].i;c.data[cno].j=b.data[p].j;cno++;p++;}else{c.data[cno].v=a.data[k].v;c.data[cno].i=a.data[k].i;c.data[cno].j=a.data[k].j;cno++;k++;}elseif(a.data[k].i>b.data[p].i){c.data[cno].v=b.data[p].v;c.data[cno].i=b.data[p].i;c.data[cno].j=b.data[p].j;cno++;p++;}else{c.data[cno].v=a.data[k].v;c.data[cno].i=a.data[k].i;c.data[cno].j=a.data[k].j;cno++;k++;};if (k==a.terms||p==b.terms){flag=1;break;}}if (flag==1)break;}if(k==a.terms&&p<b.terms)while(p<b.terms){c.data[cno].v=b.data[p].v;c.data[cno].i=b.data[p].i;c.data[cno].j=b.data[p].j;cno++;p++;}if(p==b.terms&&k<a.terms)while(k<a.terms){c.data[cno].v=a.data[k].v;c.data[cno].i=a.data[k].i;c.data[cno].j=a.data[k].j;cno++;k++;}if(k==a.terms&&p==b.terms)c.terms=cno;printf("the tripule of m+n is: i j v \n");for(i=0;i<c.terms;i++)printf(" %5d %5d %5d\n",c.data[i].i,c.data[i].j,c.data[i].v);for (i=0;i<c.rows;i++)for (j=0;j<c.cols;j++)mn[i][j]=0;for (i=0;i<c.rows;i++)for (j=0;j<c.cols;j++)for (x=0;x<c.terms;x++)if (i==c.data[x].i)if(j==c.data[x].j)mn[i][j]=c.data[x].v;printf("\n");printf("sum of matrix m+n as follows:\n");for (i=0;i<c.rows;i++)for (j=0;j<c.cols;j++){if (counter==c.cols){printf("\n");counter=0;}printf(" %d",mn[i][j]);counter++;}}。
三元组顺序结构实现稀疏矩阵相加,行序优先(Java语言描述)

三元组顺序结构实现稀疏矩阵相加,⾏序优先(Java语⾔描述)不⽤⼗字链表也可以稀疏矩阵相加时间复杂度最坏情况达到O(tuA + tuB);思路⽐较简单就不赘述了,代码如下:三元组:package ⾏逻辑链接的顺序表实现稀疏矩阵的相乘;public class Triple<T> {int row,col;T v;public Triple(){}public Triple(int row,int col, T v){this.row = row;this.col = col;this.v = v;}}构建矩阵存储结构:package ⾏逻辑链接的顺序表实现稀疏矩阵的相乘;public class Mat {final int MAXSIZE = 10;int mu,nu,tu;int rpos[] = new int[MAXSIZE + 1];//各⾏第⼀个⾮零元的位置表Triple<Integer> data[] = new Triple[MAXSIZE + 1];//Java不⽀持泛型数组public Mat(int mu,int nu,int tu){this.mu = mu;this.nu = nu;this.tu = tu;for(int i=1; i<=MAXSIZE; i++)data[i] = new Triple();}//三元组矩阵的输出public void display(){int i,j,k,m,n,count = 0;for(i=1; i<=mu; i++){for(j=1; j<=nu; j++){for(k=1; k<=tu; k++){if(i==data[k].row && j==data[k].col){System.out.print(data[k].v + " ");count = -1;break;}}if(count != -1)System.out.print("0 ");count = 0;}System.out.println();}}}相加:package ⾏逻辑链接的顺序表实现稀疏矩阵的相乘;import java.util.*;public class AddMat {public static void main(String[] args) {/** @author 王旭* @time 2014/10/14/23:50**/Scanner scan = new Scanner(System.in);int muA,nuA,tuA,muB,nuB,tuB;System.out.println("请输⼊A矩阵的⾏,列,⾮零元的个数:");muA = scan.nextInt();nuA = scan.nextInt();tuA = scan.nextInt();Mat A = new Mat(muA,nuA,tuA);System.out.println("请输⼊A矩阵的三元组:");for(int i=1; i<=tuA; i++){A.data[i].row = scan.nextInt();A.data[i].col = scan.nextInt();A.data[i].v = scan.nextInt();}System.out.println("A矩阵为:");A.display();System.out.println("请输⼊B矩阵的⾏,列,⾮零元的个数:");muB = scan.nextInt();nuB = scan.nextInt();tuB = scan.nextInt();Mat B = new Mat(muB,nuB,tuB);System.out.println("请输⼊B矩阵的三元组:");for(int i=1; i<=tuB; i++){B.data[i].row = scan.nextInt();B.data[i].col = scan.nextInt();B.data[i].v = scan.nextInt();}System.out.println("B矩阵为:");B.display();Mat C = new Mat(muA,nuA,1);add(A,B,C);System.out.println("相加后的矩阵C为:");C.display();}public static void add(Mat A, Mat B, Mat C){int k,l,temp;//C = new Mat(A.mu,A.nu,1);k = 1;l = 1;while(k<A.tu && l<B.tu){if((A.data[k].row == B.data[l].row) && (A.data[k].col == B.data[l].col)){temp = A.data[k].v + B.data[l].v;if(temp != 0){C.data[C.tu].row = A.data[k].row;C.data[C.tu].col = A.data[k].col;C.data[C.tu].v = temp;C.tu++;}k++;l++;}if(( (A.data[k].row == B.data[l].row) && (A.data[k].col < B.data[l].col) ) || (A.data[k].row<B.data[l].row)){ C.data[C.tu].row = A.data[k].row;C.data[C.tu].col = A.data[k].col;C.data[C.tu].v = A.data[k].v;C.tu++;k++;}if(( (B.data[l].row == A.data[k].row) && (B.data[l].col < A.data[k].col) ) || (B.data[l].row<A.data[k].row)){ C.data[C.tu].row = B.data[l].row;C.data[C.tu].col = B.data[l].col;C.data[C.tu].v = B.data[l].v;C.tu++;l++;}}}}。
数据结构之稀疏矩阵稀疏矩阵的存储方式和操作分析

数据结构之稀疏矩阵稀疏矩阵的存储方式和操作分析稀疏矩阵是指矩阵中大部分元素为零的特殊矩阵。
在实际应用中,稀疏矩阵经常出现,如图像处理、网络分析和科学计算等领域。
对于稀疏矩阵的存储和操作是数据结构中的重要内容。
本文将介绍稀疏矩阵的存储方式和相关操作的分析。
一、稀疏矩阵存储方式稀疏矩阵的存储方式有多种,其中三元组顺序表和二维数组是比较常用的方法。
1. 三元组顺序表三元组顺序表是一种基于行优先存储的方式,可以将稀疏矩阵以非零元素的形式存储起来。
主要包括行号、列号和元素值三个信息。
以一个4x5的稀疏矩阵为例,其中有三个非零元素分别为A[1][2]=3, A[2][3]=4, A[3][4]=5。
可以使用三元组顺序表来存储:```行号列号元素值1 2 32 3 43 4 5```三元组顺序表的优点是可以节省存储空间,同时也方便进行矩阵的操作。
但是在进行元素的查找和修改时,效率较低。
2. 二维数组二维数组是一种常见的矩阵表示方法,可以直接使用二维数组来表示稀疏矩阵。
其中非零元素的位置用实际的值表示,其余位置用零值表示。
以同样的4x5的稀疏矩阵为例,使用二维数组存储如下:```0 0 0 0 00 0 3 0 00 0 0 4 00 0 0 0 5```二维数组的优点是简单直观,并且可以快速进行元素的查找和修改。
但当稀疏矩阵的规模较大时,会造成较高的存储资源浪费。
二、稀疏矩阵的操作分析对于稀疏矩阵的操作,主要包括矩阵的转置、相加、相乘等。
1. 转置操作稀疏矩阵的转置是指将原始矩阵的行与列对调。
对于三元组顺序表来说,转置操作主要涉及到行号和列号的交换。
而对于二维数组来说,可以直接在取值的时候将行号和列号对调即可。
2. 相加操作稀疏矩阵的相加操作是指将两个矩阵对应位置的元素相加。
对于三元组顺序表来说,可以通过遍历两个矩阵的非零元素,并将其对应位置的元素相加。
而对于二维数组来说,可以直接将对应位置的元素相加即可。
3. 相乘操作稀疏矩阵的相乘操作是指将两个矩阵相乘得到一个新的矩阵。
稀疏矩阵的求和运算

作业答案:针对稀疏矩阵的三种表示方法,写出两个矩阵的求和算法。
即若A, B, C为三个矩阵,求C = A + B.1.三元组顺序表三元组顺序表的C表示如下:#define MAXSIZE 12500typedef struct{int i, j; //非零元的行列下标ElemType e;}Triple;typedef union{Triple a_Data[MAXSIZE + 1]; //三元组表,a_Data[0]未用int mu, nu, tu;}TSMatrix;算法:注意:在稀疏矩阵的三元组顺序表表示中,a_Data域中的非零元排列是有序的,即以行序为主序排列,在一行中,数据元素按列序排列。
因此整个算法可以集中到如下问题:在已知A和B阵的某一行的起始位置的情况下,如何得到C的该行的内容。
如图示:C:A:B:kB kB’其中kA,kB,kC分别为矩阵A,B,C的a_Data域的当前位置。
kX到kX’的位置是矩阵X中第i行的非零元元素。
两个矩阵的加法运算转化为第i行元素的加法。
而第i行中第j元素的加法可以描述为:1.取A和B的当前元素,若列号相同,则相加,若和非零,把结果放在C中,kA,kB,kC分别移到下一个位置;若和为零,则kA,kB移到下一个位置;2.否则,若A的列号小于B,则C的元素等于A的元素,kA,kC分别移到下一个位置;3.否则,则C的元素等于B的元素,kB,kC分别移到下一个位置;程序:// 以知A和B,求矩阵C = A + B,其中矩阵采用三元组顺序表表示status MatrixAdd_TSMatrix( TSMatrix A, TSMatrix B, TSMatrix &C){// 若矩阵A和B的行列不同,返回错误!if( A.mu != B.mu || A.nu != B.nu ){return ERROR;}// 矩阵C的行列赋值C.mu = A.mu;C.nu = B.nu;kA = kB = kC = 1; // 初始化for ( i = 0; i < C.mu; i++) // 处理每一行{// 每列元素,从kA和kB开始,依次比较A和B中元素。
稀疏矩阵加法乘法

稀疏矩阵加法乘法稀疏矩阵是指其中大部分元素都是0的矩阵,而只有极小部分元素为非0值。
与密集矩阵相比,稀疏矩阵具有更高的压缩率以及更快的计算速度,因此在大型数据处理和机器学习等领域中得到了广泛应用。
稀疏矩阵加法和乘法是稀疏矩阵计算中最基本的两个操作。
一、稀疏矩阵的表示方法基于稀疏矩阵的特殊性质,我们通常使用三元组(TUPLES)实现稀疏矩阵的存储。
三元组存储方式将一个i * j的稀疏矩阵表示为三个一维数组,分别存储非零元素的值,行坐标和列坐标。
例如,一个矩阵:1 0 00 2 00 0 3通过三元组存储方式可以表示为:value = [1, 2, 3]row = [0, 1, 2]col = [0, 1, 2]值为1的元素位于第0行第0列,值为2的元素位于第1行第1列,值为3的元素位于第2行第2列。
二、稀疏矩阵的加法两个稀疏矩阵相加的操作可以通过对两个矩阵的三元组进行合并,对于重复的元素,则将它们的值相加。
例如,对于两个矩阵A和B:A:1 0 00 2 00 0 3B:1 0 00 2 00 0 3则可以通过以下方式对A和B进行加法操作:value = [1+1, 2+2, 3+3]row = [0, 1, 2]col = [0, 1, 2]即结果矩阵为:2 0 00 4 00 0 6三、稀疏矩阵的乘法稀疏矩阵乘法的实现比较复杂,首先需要明确一点,即两个矩阵相乘的结果不一定是稀疏矩阵。
我们可以使用两种常见的算法实现稀疏矩阵的乘法:COO算法和CSR算法。
1. COO算法COO算法也称坐标格式算法,其基本思路是将两个矩阵的三元组转换成一个三元组,然后依次进行乘法运算,最后将结果累加得到最终结果的三元组。
例如,对于两个矩阵A和B:A:1 23 4B:5 67 8则可以按照以下步骤进行乘法操作:①将矩阵A表示为三元组形式:value_A = [1,2,3,4]row_A = [0,0,1,1]col_A = [0,1,0,1]②将矩阵B表示为三元组形式:value_B = [5,6,7,8]row_B = [0,0,1,1]col_B = [0,1,0,1]③对A和B的三元组进行合并得到三元组C:value_C = [1,2,3,4,5,6,7,8]row_C = [0,0,1,1,0,0,1,1]col_C = [0,1,0,1,1,0,1,0]其中row_C和col_C表示的是C中每个元素对应的行数和列数。
稀疏矩阵的加法

稀疏矩阵的加法
哎呀,说起这稀疏矩阵的加法,咱们得好好说道说道。
四川的朋友可能觉得,这加法嘛,就跟咱们平时数数儿一样,简单得很。
不过,这稀疏矩阵的加法可就有点儿门道了。
咱先说说啥子是稀疏矩阵吧。
就像贵州的辣椒,虽然辣得让人受不了,但咱们还是喜欢吃,为啥呢?因为它有特色,不是啥子都放。
稀疏矩阵也是这样,大部分元素都是零,就像贵州的山地,看似荒芜,实则藏着不少宝贝。
那加法怎么做呢?陕西的老哥可能会说,这就像咱们和面一样,得把两块面揉在一起,才能做出好吃的面条。
稀疏矩阵的加法也是这个理儿,得把两个矩阵对应位置的元素加起来。
不过,得注意啊,如果两个矩阵的形状不一样,那可就像陕西的油泼面和臊子面,虽然都是面,但混在一起就不好吃了。
咱们再说说北京的老少爷们儿,他们可能觉得这事儿得讲究个规矩,得按部就班地来。
没错,稀疏矩阵的加法也得按规矩来,不能乱来。
得先把两个矩阵对应位置的元素都找出来,然后一个一个地加起来。
这样,结果才能准确无误。
总的来说,稀疏矩阵的加法虽然看起来简单,但实际操作起来还是得小心谨慎。
就像咱们各地的方言一样,虽然各有各的特色,但都得遵守一定的规则,才能让人听得明白,理解得透彻。
所以嘛,大家在学习稀疏矩阵的加法时,也得像对待方言一样,既要理解它的特点,又要掌握它的规则,这样才能真正学好它。
试验二利用三元组表实现矩阵相加

实验二利用三元组表实现矩阵相加一、预备知识1.稀疏矩阵的三元组表压缩存储结构2.稀疏矩阵的三元组表表示方法下的相加算法二、实验目的1.掌握稀疏矩阵的三元组表存储结构的实现2.实现稀疏矩阵的三元组表表示下的相加算法三、实验内容1.编写程序,实现利用三元组表进行两个稀疏矩阵相加的算法。
要求:(1)随机产生两个可相加的稀疏矩阵(二维);(2)将产生的稀疏矩阵用两个三元组表的顺序存储结构存储;(3)将两稀疏矩阵相加的结果存储在第三个三元组表中。
2.沿用实验一编写的操作菜单进行上述的操作。
四、实验说明1.三元组表的类型定义#define MAXSIZE 1000//非零元素个数的最大值typedef struct{int row,col;//非零元素的行下标和列下标ElemType e;//非零元素的值} Triple;typedef struct{Triple data[MAXSIZE+1];//非零元素的三元组表,data[0]未用int mu,nu,tu;//矩阵的行数、列数和非零元素个数} TSMatrix;五、注意问题1.首先应输入矩阵的行数和列数,并判别给出的两个矩阵的行、列数对于所要求作的运算是否相匹配。
可设矩阵的行数和列数均不超过20。
2.程序可以对三元组的输入顺序加以限制,例如,按行优先,以便提高计算效率。
3.在用三元组表示稀疏矩阵时,相加或相减所得结果矩阵应该另生成,相加结果矩阵也可用二维数组存放。
4.三元组表是线性表的一种应用,通过它可以更好地理解线性表的存储结构。
同时矩阵又是图的重要的存储方式,所以这个实验对更好地掌握线性表对将来对图的理解都有极大的帮助。
三元组顺序表表示的稀疏矩阵加法python

在Python中,三元组顺序表表示的稀疏矩阵加法是一个重要的主题。
稀疏矩阵是指大部分元素为零的矩阵,而三元组顺序表是一种压缩稀疏矩阵的方法,它将非零元素的行列坐标及对应的值存储起来,以节省空间和提高运算效率。
在本文中,我们将探讨稀疏矩阵加法在Python中的实现方法,并深入分析其原理和应用。
一、稀疏矩阵及三元组顺序表简介1. 稀疏矩阵稀疏矩阵是指大部分元素为零的矩阵,它在实际问题中的应用非常广泛,如图像处理、网络分析、物理建模等领域。
由于其大部分元素为零,传统的存储和计算方法会浪费大量的空间和时间,因此需要一种高效的表示方法。
2. 三元组顺序表三元组顺序表是一种压缩稀疏矩阵的方法,它将非零元素的行列坐标及对应的值存储起来。
比起普通的二维数组表示方法,三元组顺序表可以更加高效地存储和计算稀疏矩阵,节省空间和提高运算效率。
二、稀疏矩阵加法的原理稀疏矩阵加法是指将两个稀疏矩阵相加,得到一个新的稀疏矩阵。
在三元组顺序表表示的稀疏矩阵中,我们可以通过遍历两个矩阵的非零元素,并按照其行列坐标进行相加,得到新的稀疏矩阵。
三、Python中的实现在Python中,我们可以通过定义稀疏矩阵类和相应的加法运算方法来实现稀疏矩阵的加法。
我们需要定义稀疏矩阵的三元组顺序表表示方法,并实现相应的初始化方法和加法运算方法。
下面是一个简单的Python示例代码:```pythonclass SparseMatrix:def __init__(self, rows, cols, data):self.rows = rowsself.cols = colsself.data = datadef __add__(self, other):result = []i, j = 0, 0while i < len(self.data) and j < len(other.data):if self.data[i][0] == other.data[j][0] and self.data[i][1] == other.data[j][1]:result.append((self.data[i][0], self.data[i][1],self.data[i][2] + other.data[j][2]))i += 1j += 1elif self.data[i][0] < other.data[j][0] or (self.data[i][0] == other.data[j][0] and self.data[i][1] < other.data[j][1]):result.append((self.data[i][0], self.data[i][1],self.data[i][2]))i += 1else:result.append((other.data[j][0], other.data[j][1], other.data[j][2]))j += 1while i < len(self.data):result.append((self.data[i][0], self.data[i][1], self.data[i][2])) i += 1while j < len(other.data):result.append((other.data[j][0], other.data[j][1],other.data[j][2]))j += 1return SparseMatrix(self.rows, self.cols, result)```在上面的示例代码中,我们定义了一个SparseMatrix类,其初始化方法接受稀疏矩阵的行数、列数和三元组顺序表表示的数据。
三元组实现稀疏矩阵加减乘

#include<stdio.h>#include<stdlib.h> #define MAXSIZE 12500 // 三元组结构typedef structinti,j;int e; }Triple;{//矩阵行下标和列下标//值typedef struct {Triple data[MAXSIZE+1];int rpos[MAXSIZE+1]; // 这是存放各行第一非零元在矩阵中的位置int mu,nu,tu; // 矩阵的行数、列数、非零元个数}Matrix;void Init(Matrix* M);void Add(Matrix* M,Matrix* T,Matrix* G);void Jian(Matrix* M,Matrix* T,Matrix* G);void Cheng(Matrix* M,Matrix* T,Matrix* G);void Cheng(Matrix* M,Matrix* T,Matrix* G); void PrintMatrix(Matrix* M);//2、初始化矩阵void Init(Matrix* M){int i;if(M->mu < 1 || M->nu < 1 || M->tu > M->mu*M->nu){printf(" 出错!\n"); //如果矩阵的行数、列数不符合要求,打印出错} for(i=1;i<=M->tu;i++) //data[0] 不用{printf(“第%d个非零元的行号:“,i); //以下为数据初始化scanf("%d",&M->data[i].i);printf(“第%d个非零元的列号:",i); scanf("%d",&M->data[i].j); printf(”第%d个非零元的元素值:",i); scanf("%d",&M->data[i].e);}printf("\n");printf(" 您创建的矩阵如下:\n"); PrintMatrix(M);} //3、矩阵相加void Add(Matrix* M,Matrix* T,Matrix* G) {G->mu = M->mu;的行、列数。
三元组表示的稀疏矩阵加法

for(x=1;x<=A.mu;x++)//对矩阵的每一行进行加法
{
while(A.data[pa].i<x) pa++;
while(B.data[pb].i<x) pb++;
while(A.data[pa].i==x&&B.data[pb].i==x)//行列值都相等的元素
稀疏矩阵的加法稀疏矩阵加法稀疏矩阵稀疏矩阵运算器什么是稀疏矩阵matlab稀疏矩阵稀疏矩阵相加稀疏矩阵运算matlab中稀疏矩阵numpy稀疏矩阵
void TSMatrix_Add(TSMatrix A,TSMatrix B,TSMatrix &C)//三元组表示的稀疏矩阵加法
{
C.mu=A.mu;C.nu=A.nu;C.tu=0;
{
if(A.data[pa].j==B.data[pb].j)
{
ce=A.data[pa].e+B.data[pb].e;
if(ce)//和不为0
{
C.data[pc].i=x;
C.data[pc].j=++;pb++;pc++;
}
}//if
else if(A.data[pa].j>B.data[pb].j)
{
C.data[pc].i=x;
C.data[pc].j=B.data[pb].j;
C.data[pc].e=B.data[pb].e;
pb++;pc++;
}
else
{
C.data[pc].i=x;
三元组实现稀疏矩阵加减乘

m++;
g++;
}
while(T->data[t].i == k) //插入T的元素
{
G->data[g].i = k;
G->data[g].j = T->data[t].j;
G->data[g].e = 0 - T->data[t].e;
}
printf("\n");
printf("您创建的矩阵如下:\n");
PrintMatrix(M);
}
//3、矩阵相加
void Add(Matrix* M,Matrix* T,Matrix* G)
{
G->mu = M->mu; //因为加减运算必须维数相等,所以M、T行、列数相等,初始化第三方矩阵的行、列数。
}
printf("\n");
printf("相加后的矩阵如下:\n");
PrintMatrix(G);
}
//4、矩阵相减
void Jian(Matrix* M,Matrix* T,Matrix* G)
{
G->mu = M->mu;
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 12500
//三元组结构
稀疏矩阵的相加

稀疏矩阵的相加题目: 稀疏矩阵的相加1、问题描述稀疏矩阵是指那些多数元素为零的矩阵。
利用“稀疏”特点进行存储和计算可以大大节省存储空间,提高计算效率。
实现一个能进行稀疏矩阵基本运算的运算器。
以“带行逻辑链接信息”的三元组顺序表表示稀疏矩阵,实现两个矩阵相加运算。
稀疏矩阵的输入形式采用三元组表示,而运算结果的矩阵则以通常的阵列形式列出。
2、设计2.1.存储结构设计稀疏矩阵的行逻辑连接的顺序表存储结构表示如下:#define MAXSIZE 20 /*非零元个数最大值*/最大值*/#define MAXRC 10 /*各行第一个非零元总数typedef struct{,列下标*/ int i,j; /*行下标int e; /*非零元值*/}Triple;typedef struct { /*行逻辑链接的顺序表*/Triple data[MAXSIZE+1]; /*非零元三元组表,data[0]未用*/int rpos[MAXRC+1]; /*各行第一个非零元的位置表*/int mu,nu,tu; /*阵的行数、列数和非零元个数*/}TSMatrix;2.2.主要算法设计对2个矩阵相加的算法如下:bool AddSMatrix(TSMatrix M,TSMatrix N,TSMatrix &Q) /*求稀疏矩阵的和Q=M+N*/{int p=1,q=1,k=1;if(M.tu==0&&N.tu==0) /*为空矩阵的情况*/{cout<<"该矩阵为空矩阵"<<endl;return 0;}while(p<=M.tu) /*不为空矩阵的情况,先看M矩阵*/{if(M.data[p].i<N.data[q].i) /*M的行比N的小,Q取M的值 */{Q.data[k].i=M.data[p].i;Q.data[k].j=M.data[p].j;Q.data[k].e=M.data[p].e;k++;p++;}else if(M.data[p].i>N.data[q].i) /*M的行值比N的大取N的值*/{Q.data[k].i=N.data[q].i;Q.data[k].j=N.data[q].j;Q.data[k].e=N.data[q].e;k++;q++;}else /*M的行值和N一样大的情况*/{if(M.data[p].j<N.data[q].j)/*M的列值比M的小取M的值*/{Q.data[k].i=M.data[p].i;Q.data[k].j=M.data[p].j;Q.data[k].e=M.data[p].e;k++;p++;}else if(M.data[p].j>N.data[q].j)/*M的列值比M的大取N的值*/ {Q.data[k].i=N.data[q].i;Q.data[k].j=N.data[q].j;Q.data[k].e=N.data[q].e;k++;q++;}else /*M和N的列值相等*/{if(M.data[p].e+N.data[q].e!=0)/*相加结果不为0才取M值*/ {Q.data[k].i=M.data[q].i;Q.data[k].j=M.data[q].j;Q.data[k].e=M.data[q].e+N.data[p].e;k++;}p++;q++;}}}while(q<=N.tu) /*再看N矩阵,直接取N值*/{Q.data[k].i=N.data[q].i;Q.data[k].j=N.data[q].j;Q.data[k].e=N.data[q].e;k++;q++;}if(M.mu>N.mu) Q.mu=M.mu;/*Q的行和列的值取M,N的最大值*/ else Q.mu=N.mu;if(M.nu>N.nu) Q.nu=M.nu;else Q.nu=N.nu;Q.tu=k-1;cout<<"相加成功"<<endl;return 1;}2.3. 测试用例设计采用一下2个稀疏矩阵进行测试: M矩阵如下:3 0 0 50 -1 0 02 0 0 0N矩阵如下:0 21 0-2 40 03.调试报告3.1调试过程程序刚写完时有不少问题,像有些变量忘定义,符号错误等等,一些很低级的错误,主要是编程过程中不仔细造成的。
实现稀疏矩阵采用三元组表示的基本运算实验报告

实现稀疏矩阵(采用三元组表示)的基本运算实验报告实现稀疏矩阵(采用三元组表示)的基本运算实验报告一实验题目: 实现稀疏矩阵(采用三元组表示)的基本运算二实验要求:(1)生成如下两个稀疏矩阵的三元组a 和 b;(上机实验指导 P92 )(2)输出 a 转置矩阵的三元组;(3)输出a + b 的三元组;(4)输出 a * b 的三元组;三实验内容:3.1 稀疏矩阵的抽象数据类型:ADT SparseMatrix {数据对象:D={aij| i = 1,2,3,….,m; j =1,2,3,……,n;ai,j∈ElemSet,m 和n分别称为矩阵的行数和列数 }数据关系 : R={ Row , Col }Row ={<ai,j ,ai,j+1> | 1≤ i≤m , 1≤ j ≤ n-1}Col ={<a i,j , a i+1,j >| 1≤i≤m-1,1≤j ≤n}基本操作:CreateSMatrix(&M)操作结果:创建稀疏矩阵M PrintSMatrix(M)初始条件:稀疏矩阵M已经存在操作结果:打印矩阵M DestroySMatrix(&M)初始条件:稀疏矩阵M已经存在操作结果:销毁矩阵M CopySMatrix(M, &T)初始条件:稀疏矩阵M已经存在操作结果:复制矩阵M到TAddSMatrix(M, N, &Q)初始条件:稀疏矩阵M、N已经存在操作结果:求矩阵的和Q=M+N SubSMatrix(M, N, &Q)初始条件:稀疏矩阵M、N已经存在操作结果:求矩阵的差Q=M-N TransposeSMatrix(M, & T)初始条件:稀疏矩阵M已经存在操作结果:求矩阵M的转置T MultSMatrix(M, N, &Q)初始条件:稀疏矩阵M已经存在操作结果:求矩阵的积Q=M*N }ADT SparseMatrix3.2存储结构的定义#define N 4typedef int ElemType;#define MaxSize 100 //矩阵中非零元素最多个数typedef struct{ int r; //行号int c; //列号ElemType d; //元素值} TupNode; //三元组定义typedef struct{ int rows; //行数值int cols; //列数值int nums; //非零元素个数TupNode data[MaxSize];} TSMatrix; //三元组顺序表定义3.3基本操作实现:void CreatMat(TSMatrix &t,ElemType A[N][N]){int i,j;t.rows=N;t.cols=N;t.nums=0;for (i=0;i<N;i++){for (j=0;j<N;j++)if (A[i][j]!=0){t.data[t.nums].r=i;t.data[t.nu ms].c=j;t.data[t.nums].d=A[i][j];t.nums++;}}}void DispMat(TSMatrix t){int i;if (t.nums<=0)return;printf("\t%d\t%d\t%d\n",t.rows ,t.cols,t.nums);printf("\t------------------\n ");for (i=0;i<t.nums;i++)printf("\t%d\t%d\t%d\n",t.data[i] .r,t.data[i].c,t.data[i].d);3.4解题思路:1.转置矩阵:只要判定原矩阵有值,那么只要遍历一遍原矩阵,把原来矩阵中非0元素行列变换一下赋值到新的矩阵中即可。
三元组顺序表表示的稀疏矩阵加法

三元组顺序表表示的稀疏矩阵加法三元组顺序表表示的稀疏矩阵加法引言:稀疏矩阵是指在矩阵中大部分元素为零的情况下,只有很少非零元素的矩阵。
由于矩阵运算的复杂性,对于大型稀疏矩阵,使用传统的矩阵加法算法会消耗大量的时间和内存资源。
因此,为了高效地进行稀疏矩阵的加法运算,可以使用三元组顺序表来表示稀疏矩阵,并通过特定的算法来实现加法操作。
本文将介绍三元组顺序表和稀疏矩阵加法,并逐步回答以下问题:1. 什么是三元组顺序表?2. 什么是稀疏矩阵加法?3. 如何使用三元组顺序表进行稀疏矩阵加法操作?一、什么是三元组顺序表?三元组顺序表是一种用来高效表示稀疏矩阵的数据结构。
在三元组顺序表中,每个非零元素用一个三元组表示,包括元素的行号、列号和值。
同时,三元组顺序表中还包含两个整数,分别表示矩阵的行数和列数。
例如,如果有一个3x3的稀疏矩阵如下:1 0 20 4 03 0 5使用三元组顺序表来表示这个矩阵,可以得到如下的三元组:(0, 0, 1), (0, 2, 2), (1, 1, 4), (2, 0, 3), (2, 2, 5)二、什么是稀疏矩阵加法?稀疏矩阵加法是指对两个稀疏矩阵进行加法运算的操作。
对于给定的两个稀疏矩阵A和B,稀疏矩阵加法的结果矩阵C的每个元素等于矩阵A和B中对应位置的元素之和。
三、使用三元组顺序表进行稀疏矩阵加法操作的步骤为了实现稀疏矩阵加法,可以按照以下步骤进行:1. 定义一个存储稀疏矩阵的三元组顺序表:使用一个结构体将矩阵的行、列和非零元素存储起来。
2. 输入矩阵A和B的维度:获取矩阵A和B的行数和列数,以及非零元素的个数。
3. 输入矩阵A和B的非零元素:获取矩阵A和B的非零元素的行号、列号和值,并将其存储到三元组顺序表中。
4. 对三元组顺序表进行排序:根据三元组的行号和列号进行排序,以便后续的加法运算。
5. 进行稀疏矩阵加法运算:从头开始遍历三元组顺序表,依次取出每个三元组,根据其行号和列号在结果矩阵C中进行加法运算。
矩阵求和的报告

实验题目稀疏矩阵求和运算实验报告一、实验目的与要求稀疏矩阵求和,要求稀疏矩阵采用三元组压缩存储结构。
要求:1.掌握稀疏矩阵的三元组存储表示方式;2.根据矩阵的求和规则实现A、B矩阵的求和运算,并将运算结果存储在C矩阵中。
3.要求A、B矩阵由键盘输入,所有矩阵均采用三元组存储。
二、实验方案算法思想:稀疏矩阵采用三元组压缩存储结构,首先,如果两矩阵的的元素行相等,同时列也相等就值相加,若列不相等,就比较列号的大小,按正序插入;如果两矩阵的的元素行不相等,就比较行号的大小,按正序插入。
#define MAX 100typedef struct{ int row,col;int val;}TriNode;typedef struct{ TriNode data[MAX];int m,n,t;}TriTable;void CreateTri(TriTable *p){ int i;printf("please input the number of row,col and not zero: ");scanf("%d,%d,%d",&p->m,&p->n,&p->t);printf("an hang you xian shu ru the number of row,col and val: \n");for (i=1;i<=p->t;i++)scanf("%d,%d,%d",&p->data[i].row,&p->data[i].col,&p->data[i].val);}void OutputTri(TriTable *p){ int i;printf("\n");printf("gai ju zhen yuan shu wei:\n");for (i=1;i<=p->t;i++)printf("%d ,%d ,%d \n",p->data[i].row,p->data[i].col,p->data[i].val);}void AddTri(TriTable *pa,TriTable *pb,TriTable *pc){ int i,j,k;i=j=k=1;while( pa->t-i>=0 && pb->t-j>=0)if(pa->data[i].row==pb->data[j].row) /*行相等*/{ if(pa->data[i].col==pb->data[j].col) /*列相等*/{ if ((pa->data[i].val+pb->data[j].val)!=0){ pc->data[k].row=pa->data[i].row;pc->data[k].col=pa->data[i].col;pc->data[k].val=pa->data[i].val+pb->data[j].val; /*求和*/k++;i++;j++;}else {i++;j++;}}else{ if (pa->data[i].col<pb->data[j].col) /*列不等*/{ pc->data[k].row=pa->data[i].row;pc->data[k].col=pa->data[i].col;pc->data[k].val=pa->data[i].val;k++;i++;}else{ pc->data[k].row=pb->data[j].row;pc->data[k].col=pb->data[j].col;pc->data[k].val=pb->data[j].val;k++;j++;} } }else{ if(pa->data[i].row<pb->data[j].row) /*行不等*/{ pc->data[k].row=pa->data[i].row;pc->data[k].col=pa->data[i].col;pc->data[k].val=pa->data[i].val;k++;i++;}else{ pc->data[k].row=pb->data[j].row;pc->data[k].col=pb->data[j].col;pc->data[k].val=pb->data[j].val;k++;j++;} }if (pa->t-i>=0)for (;i<=pa->t;i++){ pc->data[k].row=pa->data[i].row;pc->data[k].col=pa->data[i].col;pc->data[k].val=pa->data[i].val;k++;}if (pb->t-j>=0)for (;j<=pb->t;j++){ pc->data[k].row=pb->data[j].row;pc->data[k].col=pb->data[j].col;pc->data[k].val=pb->data[j].val;k++;}pc->m=pa->m;pc->n=pa->n;pc->t=k-1;}main(){ TriTable *ma,*mb,*mc;ma=(TriTable*)malloc(sizeof(TriTable));mb=(TriTable*)malloc(sizeof(TriTable));mc=(TriTable*)malloc(sizeof(TriTable));CreateTri(ma);OutputTri(ma);CreateTri(mb);OutputTri(mb);AddTri(ma,mb,mc);OutputTri(mc);getch();}三、实验结果和数据处理数组为:A .|2 0| B.|0 3| A+B.|2 3||0 4| |1 3| |1 7|四、结论本次实验过程中主要遇到的问题有以下几点:1.错误不是一个允许的类型在函数中,是因为定义类型时不符合要求。
三元组表相加

1 问题要求及任务描述1.1 题目要求三元组表相加问题描述:利用数组的顺序存储结构,实现特殊矩阵的压缩存储和稀疏矩阵的三元组存储和加法实现基本要求:1)利用稀疏矩阵的三元组存储,来实现两矩阵相加2)利用稀疏矩阵的三元组存储,来实现两矩阵相乘两个希疏矩阵分别用两个文件存放,相加后的矩阵存入一个文件后在屏幕上显示1.2 主要任务我主要负责编写两个非零稀疏矩阵相乘的程序,两个已经经过压缩存储的矩阵,运用矩阵相乘的标准法来进行计算。
2 解决问题的主要思路和方法2.1 关键问题输入两个稀疏矩阵,进行两个矩阵相乘。
然后输出相乘后的结果。
2.2 拟采用解决问题的方法运用矩阵相乘的标准法进行编程序。
利用数组的顺序存储结构,实现特殊矩阵的压缩存储和稀疏矩阵的三元组存储和加法实现,利用稀疏矩阵的三元组存储,来实现两矩阵相乘。
先输入两个矩阵,判断前一个矩阵的列数是否已后一个矩阵的行数相等,不相等就返回错误,否则继续执行,接着就使用标准法进行计算。
完成后输出正确结果。
2.3 主要算法和处理流程图是是否是否是否i=1,j=1temp=0k=1,temp+=value(A,i,k)*value(B, k, j)A 的行数与B 的列数是否相等,p=1 输入矩阵A 、Bk++,k<= A.cols? 否C.rows=A.rows; C.cols = B.cols; eroNums= p-1;C.data[p].r = i;C.data[p].c = j; C.data[p].v = temp;p++;输出C 矩阵temp=0?j++,j <= B.cols ?i++,i <= A.rows?程序结束3 程序实现3.1 程序实现时应考虑的问题调用输入函数bool InputTSMatrix(T &M, int y)在三重循环中:for (i = 1; i <= A.rows; i++){for (j = 1; j <= B.cols; j++){temp = 0;for (k = 1; k <= A.cols; k++){temp += value(A, i, k) * value(B, k, j);调用函数int value(TSMatrix M, int i, int j)求得到矩阵元素M[i][j]的值。
两个稀疏矩阵三元组相加

C-> data[c-> t++].v=A-> data[k].v;
k++;
}
while (l <B-> t)//将B中剩余三元组加入C
C-> data[c-> t++].v
=A-> data[k].v;
k++;
}
if ((A-> data[k].i==B-> data[l].i)&&(A-> data[k].j> B-> data[l].j))
scanf("%d",&A->mu);
printf("input A->nu:");
scanf("%d",&A->nu); /*输入B的列数*/
printf("input A->tu:");
B=(Tsmatrix*)malloc(sizeof(Tsmatrix));
C=(Tsmatrix*)malloc(sizeof(Tsmatrix)); /*生成A、B、C三元组存储空间*/
printf("input A->mu:");
稀疏矩阵求和

1、稀疏矩阵A和B用三元组表示,编写算法,计算C = A + B算法思想:依次扫描A和B的行号和列号如果A的当前项的行号等于B的当前项的行号,则比较其列号,将较小列的值存入C如果列号相等,则相应元素值相加存入C中如果A的当前项的行号小于B的当前项的行号,则将A的值存入C中如果A的当前项的行号大于B的当前项的行号,则将B的值存入C中void add( Matrix A, Matrix B, Matrix C){int i=1 ,j=1, k=1 ;while( i < A[0][2] && j <= B[0][2]){if( A[i][0] == B[j][0])// 如果A的当前项的行号等于B当前项的行号,则比较列号,将较小项存入C {if(A[i][1]< B[j][1]){C[k][0]= A[i][0];C[k][1]= A[i][1];C[k][2]= A[i][2];k++;i++;}else if(A[i][1]> B[j][1]){C[k][0]= B[j][0];C[k][1]= B[j][1];C[k][2]= B[j][2];k++;j++;}else // 如果行号和列号均相等,则将对应元素相加,求和结果存入C {C[k][0]= B[j][0];C[k][1]= B[j][1];C[k][2]= A[i][2]+B[j][2];If( C[k][2] !=0)k++;i++;j++;}}}else if (A[i][0] < B[j][0])// 如果A的当前项的行号小于B的当前项的行号,则将A项存入C{C[k][0]= A[i][0];C[k][1]= A[i][1];C[k][2]= A[i][2];k++;i++;}else// 如果A的当前项的行号大于B的当前项的行号,则将B项存入C {C[k][0]= B[j][0];C[k][1]= B[j][1];C[k][2]= B[j][2];k++;j++;}C[0][0]= A[0][0]; //产生第0行结果,行数,列数,非零元数个数C[0][1]= A[0][1];C[0][2]= k -1 ;}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
while(A->data[pa].i==x && B->data[pb].i==x) /*行数相等时*/
{if(A->data[pa].j==B->data[pb].j) /*列数相等时*/
{sum=A->data[pa].v+B->data[pb].v; /*矩阵想加*/
if(sum) /*相加不为零时*/
typedef int DataType; /*用户自定义*/
typedef struct
{ int i,j; DataType v; }Triple;/*定义三元组结构*/
typedef struct
{ Triple data[MaxSize];/*定义可存三元组大小*/
{C-> data[c-> t].i=A-> data[k].i;
C-> data[c-> t].j=A-> data[k].j;
C-> data[c-> t++].v=A-> data[k].v;
k++;
}
if ((A-> data[k].i==B-> data[l].i)&&(A-> data[k].j> B-> data[l].j))
l++;
}
}
while (k <A-> t)//将A中剩余三元组加入C
{C-> data[c-> t].i=A-> data[k].i;
C-> data[c-> t].j=A-> data[k].j;
C-> data[c-> t++].v=A-> data[k].v;
当稀疏矩阵A和B均以三元组表作为存储结构时,试写出矩阵相加的算法,其结果存放在三元组表C中。 解:这个算法有点繁,要考虑到两个稀疏矩阵的非零元素不是一一对应的,在建立新的三元组表C时,为了使三元组元素仍按行优先排列,所以每次插入的三元组不一定是A的,按照矩阵元素的行列去找A中的三元组,若有,则加入C,同时,这个元素如果在B中也有,则加上B的这个元素值,否则这个值就不变 如果A中没有,则找B,有则插入C,无则查找下一个矩阵元素。
C->nu=A->nu;
C->tu=0; /*定义矩阵C的非零元个数开始为0个*/
pa=1;
pb=1;
pc=1;
for(x=1;x<=A->mu;x++)
{while(A->data[pa].i<x) pa++;
while(B->data[pb].i<x) pb++;
printf("input A->tu:");
scanf("%d",&A->tu);/*输入A 的非零元*/
printf("input A:\n");/*输入A的非零元三元组*/
for(e=1;e<=A->tu;e++)/*循环输入A的三元组*/
scanf("%d%d%d",&A->data[e].i,&A->data[e].j,&A->data[e].v);
C->data[pc].v=A->data[pa].v;
pa++;
pc++;
}
}
while(A->data[pa].i==x) /*插入A剩余的元素*/
{C->data[pc].i=x;
C->data[pc].j=A->data[pa].j;
C->data[pc].v=A->data[pa].v;
当稀疏矩阵A和B均以三元组表作为存储结构时,试写出矩阵相加的算法,其结果存放在三元组表C中。
解:
矩阵相加就是将两个矩阵中同一位置的元素值相加。由于两个稀疏矩阵的非零元素按三元组表形式存放,在建立新的三元组表C时,为了使三元组元素仍按行优先排列,所以每次插入的三元组不一定是A的,按照矩阵元素的行列去找A中的三元组,若有,则加入C,同时,这个元素如果在B中也有,则加上B的这个元素值,否则这个值就不变;如果A中没有,则找B,有则插入C,无则查找下一个矩阵元素。
要求:(1)随机产生两个可相加的稀疏矩阵(二维);
(2)将产生的稀疏矩阵用两个三元组表的顺序存储结构存储;
(3)将两稀疏矩阵相加的结果存储在第三个三元组表中。
二、实验方案
#include<stdio.h>
#define MaxSize 1000 /*用户自定义*/
||(A-> data[k].i> B-> data[l].i)//将B中三元组加入C
{C-> data[c-> t].i=B-> data[l].i;
C-> data[c-> t].j=B-> data[l].j;
C-> data[c-> t++].v=B-> data[l].v;
int mu,nu,tu; }Tsmatrix;/*行数,列数,非零元*/
void addtriple( Tsmatrix *A ,Tsmatrix *B,Tsmatrix *C) /*三元组相加算法*/
{int x,sum,pb,pc,pa;
C->mu=A->mu;
C=(Tsmatrix*)malloc(sizeof(Tsmatrix)); /*生成A、B、C三元组存储空间*/
printf("input A->mu:");
/*输入A的行数*/
scanf("%d",&A->mu);
printf("input A->nu:");
scanf("%d",&A->nu); /*输入B的列数*/
{C->data[pc].i=x;
C->data[pc].j=A->data[pa].j;
C->data[pc].v=sum;
pa++;
pb++;
pc++;
Hale Waihona Puke } else if(A->data[pa].j>B->data[pb].j) /*A的列数大于B的列数时*/
if (!temp)//相加不为零,加入C
{C-> data[c-> t].i=A-> data[k].i;
C-> data[c-> t].j=A-> data[k].j;
C-> data[c-> t++].v=temp;
{C->data[pc].i=x;
C->data[pc].j=B->data[pb].j;
C->data[pc].v=B->data[pb].v;
pb++;
pc++;
}
else
{C->data[pc].i=x;
C->data[pc].j=A->data[pa].j;
}
}
C->tu=pc;
}
main()
{ Tsmatrix *A , *B, *C; int b,e,k;
A=(Tsmatrix*)malloc(sizeof(Tsmatrix));
B=(Tsmatrix*)malloc(sizeof(Tsmatrix));
pa++;
pc++;
}
while(B->data[pb].i==x) /*插入B的元素*/
{C->data[pc].i=x;
C->data[pc].j=B->data[pb].j;
C->data[pc].v=B->data[pb].v;
pb++;
pc++;
printf("\n");
addtriple( A,B,C); /*引用相加算法*/
printf("output C:\n");/*输出C的三元组*/
for(b=1;b<C->tu;b++)
printf("%d,%d,%d\n",C->data.i,C->data.j,C->data.v);
l++;
}
}
以下程序只做大家一起学习:
了解稀疏矩阵的三元组表压缩存储结构和稀疏矩阵的三元组表表示方法下的相加算法。掌握稀疏矩阵的三元组表存储结构的实现,实现稀疏矩阵的三元组表表示下的相加算法,编写程序,实现利用三元组表进行两个稀疏矩阵相加的算法。
}
k++;l++;
}
if ((A-> data[k].i==B-> data[l].i)&&(A-> data[k].j <B-> data[l].j))
||(A-> data[k].i <B-> data[l].i)//将A中三元组加入C