稀疏矩阵快速转置 数据结构实验报告
数据结构实验四稀疏矩阵运算

数据结构实验四稀疏矩阵运算1、实验目的掌握三元组法存储稀疏矩阵的方法及相关的基本操作。
2、实验内容∙用三元组法存放稀疏矩阵∙求出矩阵转置结果∙求出矩阵相乘结果∙输出结果矩阵3、实验要求∙用数组存放矩阵的三元组,矩阵的行数和列数及非0数据从键盘输入∙要求采用稀疏矩阵快速转置算法∙若两个矩阵不能相乘则输出“Error”4、试验参考程序typedef s tr uct { // 定义三元组的元素int i, j;int e;} Tr iple;typedef s tr uct { // 定义矩阵Tr iple data[MA XSI ZE + 1];int mu, nu, tu;} TSMa tr ix;typedef s tr uct { // 定义行逻辑连接矩阵Tr iple data[MA XSI ZE + 2];int rpos[MA XROW + 1];int mu, nu, tu;} RLSMatr ix;矩阵输入函数bool InPutT SMat r ix(T SMatr ix & T) {cout << "输入矩阵的行,列和非零元素个数:" << e ndl;cin >> T.mu >> T.nu >> T.tu;cout << "请输出非零元素的位置和值:" << e ndl;for (int k = 1;; k <= T.t u; k++)cin >> T.data[k].i >> T.da ta[k].j >> T.data[k].e;retur n t rue;}请补充完成下列矩阵转置函数、矩阵乘法函数与矩阵输出函数Bool Trans poseSMa tr ix(T SMa t r ix M, T SMat r ix & T){TSMatrix M,T; //定义预转置的矩阵InPutTSMatrix(M, 0); //输入矩阵int num[MAXROW+1];int cpot[MAXROW+1]; // 构建辅助数组int q,p,t;T.tu=M.tu; T.mu=M.nu; T.nu=M.mu;if(T.tu){for(int col=1;col<=M.nu;col++) num[col]=0;for(t=1;t<=M.tu;t++) ++num[M.data[t].j];cpot[1]=1;for(int i=2;i<=M.nu;i++) cpot[i]=cpot[i-1]+num[i-1]; // 求出每一列中非零元素在三元组中出现的位置for(p=1;p<=M.tu;p++){col=M.data[p].j; q=cpot[col];T.data[q].i=col; T.data[q].j=M.data[p].i;T.data[q].e=M.data[p].e; ++cpot[col];}}cout<<"输入矩阵的转置矩阵为"<<endl;OutPutSMatrix(T);return true;}Bool MultSMatr ix(RLSMatr ix M, RL SMatr ix N,RL SMat r ix & T){RLSMatrix M,N,Q; // 构建三个带“链接信息”的三元组表示的数组InPutTSMatrix(M,1); // 用普通三元组形式输入数组InPutTSMatrix(N,1);Count(M); Count(N);if(M.nu!=N.mu) return false;Q.mu=M.mu; Q.nu=N.nu; Q.tu=0; // Q初始化int ctemp[MAXROW+1]; // 辅助数组int arow,tp,p,brow,t,q,ccol;if(M.tu*N.tu){ // Q是非零矩阵for( arow=1;arow<=M.mu;arow++){///memset(ctemp,0,N.nu);for(int x=1;x<=N.nu;x++) // 当前行各元素累加器清零ctemp[x]=0;Q.rpos[arow]=Q.tu+1; // 当前行的首个非零元素在三元组中的位置为此行前所有非零元素+1 if(arow<M.mu) tp=M.rpos[arow+1];else tp=M.tu+1;for(p=M.rpos[arow];p<tp;p++){ // 对当前行每个非零元素进行操作brow=M.data[p].j; // 在N中找到i值也操作元素的j值相等的行if(brow<N.mu) t=N.rpos[brow+1];else t=N.tu+1;for(q=N.rpos[brow];q<t;q++){ // 对找出的行当每个非零元素进行操作ccol=N.data[q].j;ctemp[ccol] += M.data[p].e*N.data[q].e; // 将乘得到对应值放在相应的元素累加器里面}}for(ccol=1;ccol<=Q.nu;ccol++) // 对已经求出的累加器中的值压缩到Q中if(ctemp[ccol]){if(++Q.tu>MAXSIZE) return false;Q.data[Q.tu].e=ctemp[ccol];Q.data[Q.tu].i=arow;Q.data[Q.tu].j=ccol;}}OutPutSMatrix(Q);return true;}}boo l O utP utSMatrix(T SMat r ix T){// 输出矩阵,按标准格式输出int m,n,k=1;fo r(m=0;m<T.mu;m++){fo r(n=0;n<T.nu;n++){if((T.d a ta[k].i-1)==m&&(T.d a ta[k].j-1)==n){co ut.w id th(4);co ut<<T.d a ta[k++].e;}e ls e{co ut.w id th(4); co ut<<"0"; }}co ut<<e nd l;}re turn true;}}并建立ma in()函数对上述函数进行测试。
数据结构实验2稀疏矩阵的建立与转置

实验2 稀疏矩阵的建立与转置(一)实验目的掌握特殊矩阵的存储和操作算法。
(二)问题描述实现用三元组保存稀疏矩阵并实现矩阵转置的算法。
(三)实验步骤1. 定义稀疏矩阵的三元组形式的存储结构。
2. 实现三元组矩阵的传统转置算法(pp99 的算法5.1)。
3. 实现三元组矩阵的快速转置算法。
4. 输入矩阵非零元素,测试自己完成的算法。
(四)程序流程图(五)参考代码#include <malloc.h>#include <stdio.h>#define MAXLEN 40typedef struct{ int i, j;int v;}NODE;typedef struct{ int m, n, t;NODE data[MAXLEN];}SPMA TRIX;SPMA TRIX transpose(SPMA TRIX a){/*稀疏矩阵(三元组存储结构)转置算法*/int p, q, col;SPMA TRIX b;b.m=a.n; b.n=a.m; b.t=a.t;if(a.t!=0){q = 1;for (col=1; col<=a.n; col++) //访问b三元组的每一行for (p=1; p<=a.t; p++) //访问a三元组的每一行if(a.data[p].j==col) //如果b三元组的行对应a数组的列,就进行转置{ b.data[q].j=a.data[p].i;b.data[q].i=a.data[p].j;b.data[q].v=a.data[p].v;q++;}}return b;}void printmatrix(SPMA TRIX c){/*稀疏矩阵(三元组存储结构)显示*/int n,i;n=c.t;for(i=1;i<=n;i++)printf("[%d]行号=%d 列号=%d 元素值=%d\n",i,c.data[i].i,c.data[i].j,c.data[i].v);}void main(){ SPMA TRIX a;SPMA TRIX b;int i,j,r,c,t,n;n=1;printf("\n\n输入矩阵行号数: ");scanf("%d",&r);printf("\n\n输入矩阵列号数: ");scanf("%d",&c);a.m=r; a.n=c;printf("\n\n");for(i=0;i<r;i++) /*输入矩阵元素值*/for(j=0;j<c;j++){printf("输入元素[%d,%d]值: ",i+1,j+1);scanf("%d",&t);if(t!=0) {a.data[n].i=i+1; /*非零元素存入稀疏矩阵三元组存储结构中*/a.data[n].j=j+1; a.data[n].v=t; n=n+1;}}n=n-1; a.t=n; /*a.t中为稀疏矩阵非零元素个数*/printf("\n\n稀疏矩阵三元组表示: \n\n");printmatrix(a); /*稀疏矩阵(三元组存储结构)转置*/b=transpose(a);printf("\n\n转置后稀疏矩阵三元组表示: \n\n");printmatrix(b);printf("\n\n");}(六)运行结果(七)心得体会掌握了特殊矩阵的存储和操作原理,编写了用三元组保存稀疏矩阵并实现矩阵转置的算法。
稀疏矩阵三元组实现矩阵转置算法实验报告

稀疏矩阵三元组实现矩阵转置算法实验报告实验三稀疏矩阵的三元组表示实现矩阵转置算法学院专业班学号姓名实习目的掌握稀疏矩阵的三元组顺序表存储表示;掌握稀疏矩阵三元组表示的传统转置算法的实现;掌握稀疏矩阵三元组表示的快速转置算法的实现;实习内容稀疏矩阵的按三元组形式输入,即按行序输入非零元的行号、列号、值,实现传统转置算法,输出按通常的阵列形式输出。
稀疏矩阵的按三元组形式输入,即按行序输入非零元的行号、列号、值,实现快速转置算法,输出按通常的阵列形式输出。
实验步骤三元组的定义#define MAX_SIZE 100 // 非零元个数的最大值struct Triple{int i,j; // 行下标,列下标Elemtype e; // 非零元素值};struct TSMatrix{struct Triple data[MAX_SIZE+1]; // 非零元三元组表,data[0]未用int mu,nu,tu; // 矩阵的行数、列数和非零元个数};创建稀疏矩阵M (按三元组形式输入,即按行序输入非零元的行号、列号、值)3. 编写三元组传统转置函数。
4. 编写三元组快速转置函数。
4. .主函数(1)程序代码#include &quot;stdio.h"#include "stdlib.h"#define MAX_SIZE 100 // 非零元个数的最大值Typedef int ElemType;struct Triple{int i,j; // 行下标,列下标ElemType e; // 非零元素值};struct TSMatrix{struct Triple data[MAX_SIZE+1]; // 非零元三元组表,data[0]未用int mu,nu,tu; // 矩阵的行数、列数和非零元个数};int CreateSMatrix(TSMatrix &M){ // 创建稀疏矩阵Mint i,m,n;ElemType e;int k;printf("请输入矩阵的行数,列数,非零元素数:");scanf("%d,%d,%d",&M.mu,&M.nu,&M.t u);if(M.tuMAX_SIZE)return -1;M.data[0].i=0; // 为以下比较顺序做准备for(i=1;i=M.tu;i++){do{printf("请按行序顺序输入第%d个非零元素所在的行(1~%d),列(1~%d),元素值:",i,M.mu,M.nu);scanf("%d,%d,%d",&m,&n,&e); //输入非零元的行号、列号、元素值k=0;if(m1||mM.mu||n1||nM.nu) // 行或列超出范围k=1;if(mM.data[i-1].i||m==M.data[i-1].i&&n=M.data[i-1].j) // 行或列的顺序有错k=1;}while(k);M.data[i].i =m; // 将m,n,e 填入MM.data[i].j =n;M.data[i].e =e;}return 1;}void PrintSMatrix(TSMatrix M){ // 按矩阵形式输出Mint i,j,k=1;Triple *p=M.data;p++; // p指向第1个非零元素for(i=1;i=M.mu;i++){for(j=1;j=M.nu;j++)if(k=M.tu&&p-i==i&&p-j==j)// p指向非零元,且p所指元素为当前处理元素{printf("%3d",p-e); // 输出p所指元素的值p++; // p指向下一个元素k++; // 计数器+1}else // p所指元素不是当前处理元素Printf("%3d",0); // 输出0printf("\n");}}void TransposeSMatrix(TSMatrix M,TSMatrix &T) { // 求稀疏矩阵M的转置矩阵T。
稀疏矩阵数据结构实验报告

目录1.需求分析 (1)2.概要设计 (2)2.1链表对稀疏矩阵进行定义 (2)2.3程序一共有五个功能 (2)3.详细设计 (3)3.1稀疏矩阵存储算法分析 (3)3.2稀疏矩阵各运算算法分析 (3)4.调试分析 (8)4.1调试过程中的问题及解决方法 (8)4.2算法的时间复杂度和空间复杂 (8)4.3经验和体会 (8)5.用户使用说明 (9)6.测试结果 (10)6.1程序主界面 (10)6.2其他函数操作界面显示 (10)参考文献 (15)致谢 (16)1.需求分析矩阵在日常生活中应用广泛,尤其是有些特殊矩阵的运算。
但是在实际应用中有一种矩阵,在m×n的矩阵中有t个非零元素,且t远小于m×n,我们这样的矩阵被称为稀疏矩阵。
由于这类矩阵中通常零元素是没有规律的,为了能够找到相应的元素,仅存储非零元素的值是不行的,还要存储其所在的行和列等信息。
本程序主要的任务是创建稀疏矩阵,并且利用C++算法程序实现相应的运算(转置,加法,减法,乘法)(1)输入的形式以及范围:键盘输入符合要求的稀疏矩阵。
(2)输出形式:最终运算结果以矩阵的形式输出。
(3)程序功能实现:输入矩阵通过程序运算出相应的转置矩阵以及两个符合要求的矩阵的加减乘除法的运算。
(4)测试数据:如果输入正确,程序会显示最后的运算结果;否则错误时则会返回上层。
2.概要设计要存储稀疏矩阵并且进行运算,那么就要了解稀疏矩阵的存储结构,这里采用链表的形式存储稀疏矩阵并进行运算。
2.1链表对稀疏矩阵进行定义typedef struct OLNode{ // 定义链表元素int i,j;int e;struct OLNode *next; // 该非零元所在行表和列表的后继元素}OLNode,*OLink;typedef struct{ // 定义链表对象结构体OLink *head; //头指针int mu,nu,tu; // 行数,列数,和非零元素个数}CrossList;2.3程序一共有五个功能1.用CreateSMatrix_OL(M)函数来实现稀疏矩阵的存储,用OutPutSMatrix_OL(M)函数实现稀疏矩阵的输出。
数据结构实验报告稀疏矩阵运算

数据结构实验报告稀疏矩阵运算实验目的:1.学习并理解稀疏矩阵的概念、特点以及存储方式。
2.掌握稀疏矩阵加法、乘法运算的基本思想和算法。
3.实现稀疏矩阵加法、乘法的算法,并进行性能测试和分析。
实验原理:稀疏矩阵是指矩阵中绝大多数元素为0的矩阵。
在实际问题中,有许多矩阵具有稀疏性,例如文本矩阵、图像矩阵等。
由于存储稀疏矩阵时,对于大量的零元素进行存储是一种浪费空间的行为,因此需要采用一种特殊的存储方式。
常见的稀疏矩阵的存储方式有三元组顺序表、十字链表、行逻辑链接表等。
其中,三元组顺序表是最简单直观的一种方式,它是将非零元素按行优先的顺序存储起来,每个元素由三个参数组成:行号、列号和元素值。
此外,还需要记录稀疏矩阵的行数、列数和非零元素个数。
稀疏矩阵加法的原理是将两个稀疏矩阵按照相同的行、列顺序进行遍历,对于相同位置的元素进行相加,得到结果矩阵。
稀疏矩阵乘法的原理是将两个稀疏矩阵按照乘法的定义进行计算,即行乘以列的和。
实验步骤:1.实现稀疏矩阵的三元组顺序表存储方式,并完成稀疏矩阵的初始化、转置、打印等基本操作。
2.实现稀疏矩阵的加法运算,并进行性能测试和分析。
3.实现稀疏矩阵的乘法运算,并进行性能测试和分析。
4.编写实验报告。
实验结果:经过实验测试,稀疏矩阵的加法和乘法算法都能正确运行,并且在处理稀疏矩阵时能够有效节省存储空间。
性能测试结果表明,稀疏矩阵加法、乘法的运行时间与非零元素个数有关,当非零元素个数较少时,运算速度较快;当非零元素个数较多时,运算速度较慢。
实验分析:稀疏矩阵的运算相对于普通矩阵的运算有明显的优势,可以节省存储空间和运算时间。
在实际应用中,稀疏矩阵的存储方式和运算算法都可以进行优化。
例如,可以采用行逻辑链接表的方式存储稀疏矩阵,进一步减少存储空间的占用;可以采用并行计算的策略加快稀疏矩阵的运算速度。
总结:通过本次实验,我深入学习了稀疏矩阵的概念、特点和存储方式,掌握了稀疏矩阵加法、乘法的基本思想和算法,并通过实验实现了稀疏矩阵的加法、乘法运算。
数据结构稀疏矩阵转置,加法

数据结构稀疏矩阵转置,加法《数据结构》实验报告◎实验题⽬:稀疏矩阵的转置、加法(⾏逻辑链接表)◎实验⽬的:学习使⽤三元组顺序表表⽰稀疏矩阵,并进⾏简单的运算◎实验内容:以三元组表表⽰稀疏矩阵,并进⾏稀疏矩阵的转置和加法运算。
⼀、需求分析该程序⽬的是为了⽤三元组表实现稀疏矩阵的转置和加法运算。
1、输⼊时都是以三元组表的形式输⼊;2、输出时包含两种输出形式:运算后得到的三元组表和运算后得到的矩阵;3、测试数据:(1)转置运算时输⼊三元组表:1 2 121 3 93 1 -33 6 144 3 245 2 186 1 156 4 -7得到转置后的三元组表:1 3 -31 6 152 1 122 5 183 1 93 4 244 6 -76 3 14(2)进⾏加法运算时先输⼊矩阵A(以三元组表形式):1 1 12 2 22 3 43 1 -4输⼊矩阵B(以三元组表形式):1 3 -22 3 -53 1 83 2 -6A与B的和矩阵以矩阵形式输出为:1 0 -20 2 -14 -6 0(⼆) 概要设计为了实现上述操作⾸先要定义三元组表,稀疏矩阵:typedef struct{int i,j;int e;}Triple;//三元组typedef struct{Triple data[MAXSIZE+1];int mu,nu,tu;}Matrix;//稀疏矩阵1.基本操作void CreatMatrix(Matrix *m)操作结果:创建⼀个稀疏矩阵。
void PrintMatrix(Matrix m)初始条件:矩阵m已存在。
操作结果:将矩阵m以矩阵的形式输出。
void FastTransposeMatrix(Matrix a,Matrix *b)初始条件:稀疏矩阵a已存在;操作结果:将矩阵a进⾏快速转置后存⼊b中。
void AddMatrix(Matrix a,Matrix b,Matrix *c)初始条件:稀疏矩阵a和b都已存在;操作结果:将矩阵a和b的和矩阵存⼊c中。
数据结构稀疏矩阵的表示和转置

数据结构实验报告实验四稀疏矩阵的表示和转置一、实验目的1. 掌握稀疏矩阵的三元组顺序表存储结构2. 掌握稀疏矩阵的转置算法。
二、实验内容采用三元组表存储表示,求稀疏矩阵M的转置矩阵T。
(算法5.1)三、实验步骤:1. 构建稀疏矩阵M。
2. 求稀疏矩阵M的转置矩阵T。
3. 输出稀疏矩阵M和稀疏矩阵T。
四、算法说明首先要创建稀疏矩阵的三元组顺序表存储表示,定义mu,nu,tu分别表示矩阵的行数、列数和非零元个数。
在进行稀疏矩阵的转置时要做到(1):将矩阵的行列值相互交换;(2):将每个三元组的i,j相互调换;(3):重排三元组之间的次序便可实现矩阵的转置。
五、测试结果六、分析与探讨在此次程序中转置的方法称为快速转置,在转置前,应先求得M的每一列中非零元的个数,进而求得每一列的第一个非零元的位置。
七、附录:源代码数据结构实验报告源代码列在附录中,要求程序风格清晰易理解,有充分的注释。
有意义的注释行不少于30%。
#include <stdio.h>#define MAXSIZE 5#define MAXMN 200typedef struct{int i,j;int e;}Triple;typedef struct{Triple data[MAXSIZE];int rpos[MAXMN];int mu,nu,tu;//矩阵的行数、列数和非零元个数}TSMatrix; //行逻辑连接的顺序表int main(){printf("矩阵M\n");TSMatrix M,T;printf("i j v\n");int i;for(i=0;i<MAXSIZE;i++)scanf("%d %d %d",&M.data[i].i, &M.data[i].j, &M.data[i].e); printf("请输入矩阵M的行数mu,列数nu,及非零元的个数tu\n"); scanf("%d %d %d",&M.mu, &M.nu, &M.tu);//求稀疏矩阵M的转置矩阵TT.mu=M.nu; T.nu=M.mu; T.tu=M.tu;if(T.tu){int t, column, num[MAXMN]={0}; //用来统计M中每列非零元的个数for(t=0;t<M.tu;t++)++num[M.data[t].j];T.rpos[0]=0; for(column=1;column<T.mu;column++)T.rpos[column]=T.rpos[column-1]+num[column-1]; int p, q;for(p=0;p<M.tu;p++){column=M.data[p].j;q=T.rpos[column];T.data[q].i=M.data[p].j;T.data[q].j=M.data[p].i;数据结构实验报告T.data[q].e=M.data[p].e;T.rpos[column]++; //转置矩阵T中同一行的非零元的起始位置自增1 } }//输出矩阵M及转置矩阵Tprintf("\n矩阵T:\n");printf("i j v\n");for(i=0;i<T.tu;i++)printf("%d %d %d\n",T.data[i].i, T.data[i].j, T.data[i].e); printf("\n");return 0;}欢迎您的下载,资料仅供参考!致力为企业和个人提供合同协议,策划案计划书,学习课件等等打造全网一站式需求。
中国石油大学数据结构上机实验

《数据结构》实验报告学号2015011512 姓名胡明禹专业数学与应用数学时间2018.4.24一、实验题目实验5 稀疏矩阵的转置二、实验目的1. 稀疏矩阵的压缩存储方法2. 掌握稀疏矩阵的转置算法三、算法设计分析(一)实验内容1.从键盘输入数据,建立稀疏矩阵的三元组顺序存储2.实现稀疏矩阵的转置算法3.输出原矩阵及转置后的矩阵4.实现矩阵的快速转置算法(二)总体设计此处给出主要函数功能、及函数间调用关系的的描述。
例如:①创建稀疏矩阵函数②转置矩阵T函数③快速转置函数④输出函数⑤输出原矩阵和转置函数其功能描述如下:(1)主函数:统筹调用各个函数以实现相应功能Status main()(2)①创建稀疏矩阵函数Status CreateSMatrix(TSMatrix &M){printf("请输入原矩阵:\n");printf("行数、列数:");scanf("%d%d", &M.mu, &M.nu);printf("元素总数:");scanf("%d", &M.tu);printf("输入各个对应压缩值:\n");for (int i = 1; i <= M.tu; ++i)scanf("%d%d%d", &M.data[i].i, &M.data[i].j, &M.data[i].e); return OK;}②转置矩阵T函数Status TransposeSMatrix(TSMatrix M, TSMatrix &T){ int p, q, col;T.mu = M.nu; T.nu = M.mu; T.tu = M.tu;if (T.tu){q = 1;for (col = 1; col <= M.nu; ++col)for (p = 1; p <= M.tu; ++p)if (M.data[p].j == col){T.data[q].i = M.data[p].j;T.data[q].j = M.data[p].i;T.data[q].e = M.data[p].e;++q;}}printf("\n\n稀疏矩阵M转置成功。
矩阵转置实验报告doc

矩阵转置实验报告篇一:实验报告矩阵快速转置实验报告实验项目名称:实现矩阵的快速转置的操作所属课题名称:数据结构实验类型:验证实验实验日期:XX/12/20学院:数学与信息科学学院专业: 信息与计算科学班级: 082班姓名:李晓璐学号:0801214037实验稀疏矩阵的快速转置操作一、实验目的1、了解稀疏矩阵的三元组存储形式。
2、熟悉掌握三元表存储矩阵的转置算法。
二、实验环境硬件:PC 微型计算机、256M以上内存,40G以上硬盘。
软件:Windows XP,Turbo C/C++三、实验内容转置运算是一种最简单的矩阵运算。
对于一个m*n的矩阵M,它的转置矩阵T是一个n*m的矩阵。
假设a和b是TSMatrix型的变量,分别表示矩阵M和T。
按照a.data中三元组的次序进行转置,并将转置后的三元组置入b中恰当的位置。
实现由a得到b的方式如下。
在转置前,应先求得M的每一列中非零元的个数,进而求得每一列的第一个非零元在b.data中应有的位置。
在此,设num和cpot两个向量,num[col]表示矩阵M中第col列中非零元的个数,cpot[col]指示M中第col列的第一个非零元在b.data中应有的位置。
显然有:cpot[1]=1;cpot[col]=cpot[col-1]+num[col-1]四、实验步骤1、本实验的程序清单如下。
“TSMatrix.h”#define MAXSIZE 12500#define OK 1#define ERROR 0#define TRUE 1#define FALSE 0#define OVERFLOW 0typedef int Status;typedef int ElemType;struct Triple{int i,j;ElemType e;};class TSMatrix{public:TSMatrix(){mu=0;nu=0;tu=0;}; TSMatrix(int,int,int);~TSMatrix(){};void setTSMatrix();Status PrintSMatrix();Status TransposeSMatrix(TSMatrix &T);Status FastTransposeSMatrix(TSMatrix &T);private:Triple data[MAXSIZE+1]; int mu,nu,tu;};TSMatrix::TSMatrix(int a,int b,int c){mu=a;nu=b;tu=c;for(int p=1;p {printf("依次输入稀疏矩阵第%d个非零元的行号,列号,元素:",p);scanf("%d,%d,%d",&data[p].i,&data[p].j,&dat a[p].e);}}void TSMatrix::setTSMatrix(){cout cin>>mu;cout cin>>nu;cout cin>>tu;for(int p=1;p {printf("依次输入稀疏矩阵第%d个非零元的行号,列号,元素:",p);scanf("%d,%d,%d",&data[p].i,&data[p].j,&dat a[p].e);}}Status TSMatrix::PrintSMatrix(){int k=1,t=0;for(int p=1;p {for(int q=1;q {if(p==data[k].i&&q==data[k].j&&k { cout.width(3);cout.setf(ios::left);cout cout.unsetf(ios::left);k++;}else{cout.width(3);cout.setf(ios::left);cout cout.unsetf(ios::left);}}cout }return OK;}Status TSMatrix::TransposeSMatrix(TSMatrix &T){int col,p,q;T.mu=nu;T.nu=mu;T.tu=tu;if(T.tu){q=1;for(col=1;col for(p=1;p if(data[p].j==col){T.data[q].i=data[p].j;T.data[q].j=data[p].i;T.data[q].e=data[p].e;++q;}}return OK;}Status TSMatrix::FastTransposeSMatrix(TSMatrix &T){int col,p,q,t;int *num=new int[10],*cpot=new int[10];num=(int*)malloc(tu*sizeof(int));cpot=(int*)malloc(tu*sizeof(int));T.mu=nu;T.nu=mu;T.tu=tu;if(T.tu){for(col=1;col for(t=1;t cpot[1]=1;for(col=2;col {col=data[p].j;q=cpot[col];T.data[q].i=data[p].j; T.data[q].j=data[p].i; T.data[q].e=data[p].e; ++cpot[col];}}return OK;}“TSMstrixMain.cpp”#include"iostream" using namespace std; #include"TSMatrix.h" int main(){TSMatrix M,T;cout M.setTSMatrix();M.PrintSMatrix();M.TransposeSMatrix(T);cout T.PrintSMatrix();M.FastTransposeSMatrix(T);cout T.PrintSMatrix();return 0;篇二:稀疏矩阵三元组实现矩阵转置算法实验报告实验三稀疏矩阵的三元组表示实现矩阵转置算法学院专业班学号姓名一.实习目的1. 掌握稀疏矩阵的三元组顺序表存储表示;2. 掌握稀疏矩阵三元组表示的传统转置算法的实现;3. 掌握稀疏矩阵三元组表示的快速转置算法的实现;二.实习内容1. 稀疏矩阵的按三元组形式输入,即按行序输入非零元的行号、列号、值,实现传统转置算法,输出按通常的阵列形式输出。
数据结构实验之稀疏矩阵的转置

实验六:稀疏矩阵的转置[实验题目]改编教材中一维数组类,增加成员函数Array1D<T> & operator +(Array1D<T>& c2);,可以做求和运算,并在主程序里输入完两个长度相同的一维数组之后,调用这个成员函数求和。
完善教材中稀疏矩阵,调试转置运算,并编写出两个重定义的流操作运算,并自行编写主程序验证输出两个三元组,稀疏矩阵转置是否成功。
[概要分析]对一个稀疏矩阵,写成行三元组形式,对行三元组扫描一次即可定位,而关键是找到每列(0,1,…,n-1)首个非0元素的位置,在新的三元组转置,记在k数组中。
分别建立SeqTriple.cpp、SeqTriple.h、TsteSeqTripleMain.cpp。
[详细设计]1.类的结构2.核心代码(1)转置思路:快速转置算法使用n个指针k[i](0<=i<n)(n是矩阵的列数),指向稀疏矩阵M中i列的第一个非零元素在转置后的三元组B中的存放位置。
有了k[i],只要对三元组扫描一次即可定位。
关键在于找到每列首个非零元素的位置k[0]=0;k[i]=k[i-1]+num[i-1];具体代码:void SeqTriple<T>::Transpose(SeqTriple<T>& B)const{ //将this 转置赋给Bint *num=new int[n]; int *k=new int[n]; //为num和k分配空间B.m=n; B.n=m; B.t=t;if (t>0){for (int i=0; i<n; i++) num[i]=0; //初始化numfor (i=0; i<t; i++) num[trip[i].col]++; //计算numk[0]=0;for(i=1; i<n; i++) k[i]=k[i-1]+num[i-1]; //计算kfor(i=0; i<t; i++){ //扫描this对象的三元组表int j=k[trip[i].col]++; //求this对象的第i项在B中的位置jB.trip[j].row=trip[i].col; //将this对象的第i项转置到B的位置jB.trip[j].col=trip[i].row;B.trip[j].value=trip[i].value;}}delete [] num;delete [] k;}(2)整体赋值思路:先将本类对象所占空间清空,再按赋值对象(即参数对象)规格重新申请空间,最后循环拷贝每个元素。
稀疏矩阵的转置实训报告

#### 一、实训背景稀疏矩阵在计算机科学和工程领域中有着广泛的应用,特别是在处理大规模数据时,由于其数据压缩的特性,可以显著降低存储空间和计算时间。
稀疏矩阵的转置是稀疏矩阵处理中的一个基本操作,对于理解稀疏矩阵的性质和进行后续的矩阵运算至关重要。
本实训旨在通过实现稀疏矩阵的转置功能,加深对稀疏矩阵数据结构和操作的理解。
#### 二、实训目标1. 理解稀疏矩阵的概念和特点。
2. 掌握稀疏矩阵的三元组表示方法。
3. 实现稀疏矩阵的转置操作。
4. 分析转置操作的算法复杂度。
5. 对比不同转置算法的性能。
#### 三、实训内容1. 稀疏矩阵的三元组表示稀疏矩阵的三元组表示法通过三元组(i, j, e)来存储非零元素,其中i和j分别表示行和列的索引,e表示对应的元素值。
这种方法能够有效地压缩存储空间。
2. 稀疏矩阵的转置稀疏矩阵的转置操作涉及到交换行和列的索引。
具体步骤如下:- 遍历原稀疏矩阵中的所有非零元素。
- 对于每个非零元素(i, j, e),将其存储为(j, i, e)并添加到转置矩阵中。
3. 算法实现使用C++语言实现稀疏矩阵的转置,主要包括以下步骤:- 定义稀疏矩阵的数据结构。
- 实现转置函数。
- 测试转置函数的正确性和效率。
4. 性能分析分析不同转置算法的时间复杂度和空间复杂度,对比不同实现方式的性能。
#### 四、实训过程1. 数据结构设计使用结构体来定义稀疏矩阵的三元组,包括行索引、列索引和元素值。
同时,定义一个数组来存储所有的三元组。
2. 转置函数实现实现一个转置函数,该函数接收一个稀疏矩阵的三元组数组,返回一个新的三元组数组,表示转置后的稀疏矩阵。
3. 测试编写测试代码,创建一个稀疏矩阵实例,调用转置函数,并验证转置后的矩阵是否正确。
4. 性能测试使用不同的稀疏矩阵实例进行性能测试,比较不同实现方式的效率。
#### 五、实训结果与分析1. 结果通过实训,成功实现了稀疏矩阵的转置功能,并验证了其正确性。
稀疏矩阵快速转置 数据结构实验报告

稀疏矩阵快速转置数据结构实验报告一、实验目的1、掌握稀疏矩阵的存储方式;2、掌握稀疏矩阵的快速转置算法;3、进一步了解和巩固线性表和链表的相关知识。
二、实验内容1、根据课本内容和参考资料,设计两种不同的存储稀疏矩阵的结构体,并分别实现稀疏矩阵的快速转置操作;2、实现输出稀疏矩阵、打印转置后的稀疏矩阵、以及转置前后两个稀疏矩阵在内存中的存储情况。
三、实验原理1、稀疏矩阵的存储稀疏矩阵指的是矩阵中绝大多数元素为零的矩阵,依据存储方式,目前主要有两种实现方法:顺序表和链表。
(1)顺序表顺序表的存储方式如下:typedef struct{int arr[MAXSIZE]; // 一维数组表示矩阵int rows; // 矩阵共有 rows 行int cols; // 矩阵共有 cols 列int nums; // 矩阵中不为零的元素共有 nums 个}TSMatrix;其中,数组 arr 的长度为 MAXSIZE,每个元素保存矩阵中某个元素的值,且元素的下标按行优先排列,例如,在一个5×5 的矩阵中,a23 可以表示成 a[(2-1)×5+3-1],其中 2-1 代表该元素所在行的下标,3-1 代表该元素所在列的下标。
(2)链表链式存储的特点在于元素之间存在指针联系,节点中保存三元组(row、col、val),其中 row 表示该元素所在的行,col 表示该元素所在的列,val 表示该元素的值,next 指针表示该元素的下一个节点。
2、稀疏矩阵转置稀疏矩阵转置的基本思想是将原矩阵中非零元素的行和列对换。
转置后的矩阵中行和列的值对应变换,对应的非零元素也跟着变化。
1、初始化转置矩阵;2、遍历原矩阵中的元素,将其转置后按行优先的顺序插入转置矩阵;3、输出转置矩阵。
链表转置的步骤如下:四、实验步骤1、根据上述原理,设计 2 种结构体 TSMatrix 和 LinkMatrix,分别完成快速转置算法;2、封装 tranverse_TMatrix 和 tranverse_LinkMatrix 两个函数,并设计测试用例验证结果。
java稀疏矩阵快速转置(精品文档)_共7页

置后送出)。
4.【高级语言代码】//定义稀疏矩阵类SparseMatrixclass SparseMatrix {//稀疏矩阵的行数/列数/非零元素数int Rows,Cols,Terms;//动态分配结构体数组(三元组表)public Trituple smArray[];//构造函数:稀疏矩阵的行数/列数/非零元素数public SparseMatrix(int MaxRow,int MaxCol,int MaxTerms,int a[][],float v[]) {//稀疏矩阵的初始化Rows=MaxRow;Cols=MaxCol;Terms=MaxTerms;smArray=new Trituple[MaxTerms]; //三元组表for(int i=0;i<MaxTerms;i++) {Trituple tmp=new Trituple(a[i][0],a[i][1],v[i]); //构成一行smArray[i]=tmp; //加入表中}}//重载构造方法:空三元组public SparseMatrix(int Rows,int Cols,int Terms) {this.Rows=Rows; //这里this不可省略this.Cols=Cols;this.Terms=Terms;this.smArray=new Trituple[Terms]; //空三元组表for(int i=0;i<this.Terms;i++) { //不初始化不能用。
Trituple tmp=new Trituple(0,0,0.0f); //构成一行smArray[i]=tmp; //加入表中(这里为什么可以省略this?)}}//显示输出稀疏矩阵void display(){int i,j,k;System.out.println("稀疏矩阵的行数 "+Rows);System.out.println("稀疏矩阵的列数 "+Cols);//按先行后列顺序输出矩阵for(i=0;i<Rows;i++) {for(j=0;j<Cols;j++) {for(k=0;k<Terms;k++) //查三元组表if(i==smArray[k].row&&j==smArray[k].col){System.out.print(smArray[k].value+" ");break; //打断k循环}if(k==Terms) System.out.print("0 ");}System.out.println(); //换行}}//稀疏矩阵的快速转置方法(将自身转置后送出)public SparseMatrix FastmTrans(){//转置矩阵的列数,行数和非零元素个数(交换行列数)SparseMatrix b=new SparseMatrix(Cols,Rows,Terms); //构造方法二//分配辅助数组int rowSize[] = new int[this.Cols];int rowStart[] = new int[this.Cols];//统计每列的非零元素个数for (int i = 0; i < this.Cols; i++)rowSize[i] = 0;for (int i = 0; i < this.Terms; i++ )rowSize[this.smArray[i].col]++;//转置后,每行第一个非零元素在三元组表中的位置rowStart[0] = 0;for (int i = 1; i < this.Cols; i++ )rowStart[i] = rowStart[i-1]+rowSize[i-1];//快速转置for (int i = 0; i < this.Terms; i++ ) {int j = rowStart[this.smArray[i].col];//首先遇到的总是本行第一个非零元素b.smArray[j].row = this.smArray[i].col;b.smArray[j].col = this.smArray[i].row;b.smArray[j].value = this.smArray[i].value;//为本行的下一个非零元素定好位置rowStart[this.smArray[i].col]++;}return b;}} //稀疏矩阵类SparseMatrix结束(四)、程序的输入输出和运行结果截屏程序运行结果截屏:。
数据结构实验报告实验五稀疏矩阵运算器

一、引言稀疏矩阵是一个具有大量零元素的矩阵,对于大规模的矩阵来说,如果没有充分利用矩阵的稀疏性质,将会带来很大的存储空间和计算时间上的浪费。
为了解决这个问题,我们需要通过设计一个稀疏矩阵运算器来对稀疏矩阵进行各种运算,以提高计算效率。
二、实验目标本实验的主要目标是设计一个稀疏矩阵运算器,通过实现对稀疏矩阵的加法、乘法和转置等操作,实现对稀疏矩阵的高效运算。
三、设计思路和方法1. 矩阵的表示方式在设计稀疏矩阵运算器时,我们需要选择合适的数据结构来表示稀疏矩阵。
由于稀疏矩阵中大部分元素为零,我们可以采用压缩存储的方法来表示稀疏矩阵。
一种常用的压缩存储方法是使用三元组表示法,即将矩阵的非零元素的值、所在的行号和列号分别存储在一个三元组中。
2. 加法运算稀疏矩阵的加法运算是指将两个稀疏矩阵进行对应位置的相加操作。
在进行稀疏矩阵的加法运算时,首先需要判断两个矩阵的维度是否相同,然后通过遍历两个矩阵的非零元素,将相同位置的元素进行相加得到结果。
3. 乘法运算稀疏矩阵的乘法运算是指将两个稀疏矩阵进行矩阵乘法操作。
在进行稀疏矩阵的乘法运算时,首先需要判断第一个矩阵的列数是否等于第二个矩阵的行数,然后通过遍历两个矩阵的非零元素,按照行和列的顺序对应相乘,再将相乘的结果加到结果矩阵中。
4. 转置运算稀疏矩阵的转置运算是指将矩阵的行和列对换。
在进行稀疏矩阵的转置运算时,只需要将矩阵的非零元素的行号和列号对换即可。
五、实验结果与分析我们在实现稀疏矩阵运算器后,对其进行了测试。
通过测试,我们发现稀疏矩阵运算器能够正确地进行稀疏矩阵的加法、乘法和。
数据结构实验第五实验

实验五稀疏矩阵的快速转置
一、实验目的
熟悉数组的有关概念,掌握稀疏矩阵的三元组存储结构及其快速转置算法。
二、实验内容
键盘任意输入一个稀疏矩阵A(m*n)(也可以随机得产生一个稀疏矩阵),采用三元组存储方法求其转置矩阵B(n*m),并用快速转置算法实现该操作。
三、实验要点及说明
稀疏矩阵的快速转置方法是预先确定好被转置矩阵的每一列的第一个非零元在转置后的目标矩阵三元组中的应有位置。
为了确定相应位置,转置前必须求得稀疏矩阵A的三元组中每列非零元的个数,从而求得每列的第一个非零元在转置矩阵B的三元组中(行)的位置。
为此需要两个辅助数组num和cpot,num[col]表示矩阵A的第col列中非零元的个数,cpot[col]矩阵A的第col列的第一个非零元在矩阵B中的恰当位置,且显然有:
cpot[1]=1;
cpot[col]= cpot[col-1]+ num[col-1] 2≤ col≤ A的列
四、思考题
采用三元组存储实现方法求两个稀疏矩阵的乘积?。
稀疏矩阵快速转置 数据结构实验报告

各操作的算法时间复杂度比较合理ห้องสมุดไป่ตู้Creatarray,print 为 O(a*b) 其中 a 和 b 分别表示稀疏矩阵的行列数
4
fasttrans 为 O(tu) 其中 tu 表示稀疏矩阵中的非零个数
5.本次实验采用数据抽象的程序设计方法,将程序化为三层次结构,设计时思路清晰,使
{ for(col=1;col<=M->nu;col++) num[col]=0; for(t=1;t<=M->tu;t++) ++num[M->data[t].j]; cpot[1]=1; for(col=2;col<=M->nu;col++) cpot[col]=cpot[col-1]+num[col-1]; for(p=1;p<=M->tu;++p)
2
Tsmatrix * fasttrans(Tsmatrix *M,Tsmatrix *T) { int p,col,q,t,m; int num[100]; int cpot[100]; T->mu=M->nu; T->nu=M->mu; T->tu=M->tu; if(T->tu!=0) { for(col=1;col<=M->nu;col++) num[col]=0; for(t=1;t<=M->tu;t++) ++num[M->data[t].j]; cpot[1]=1; for(col=2;col<=M->nu;col++) cpot[col]=cpot[col-1]+num[col-1]; for(p=1;p<=M->tu;++p) { col=M->data[p].j; q=cpot[col]; T->data[q].i=M->data[p].j; T->data[q].j=M->data[p].i; T->data[q].e=M->data[p].e; ++cpot[col]; } } printf("\n\nzhuan zhi hou de san yuan zu biao shi wei :\n\n"); for(m=1;m<=T->tu;m++) printf("%3d%3d%3d\t",T->data[m].i,T->data[m].j,T->data[m].e); printf("\n"); return T; } /*输出三元组函数*/ void print(Tsmatrix *T,int x,int y) { int m,n,p=1; int d; for(m=1;m<=x;m++) { printf("\n"); for(n=1;n<=y;n++) { if(T->data[p].i==m&&T->data[p].j==n) { d=T->data[p].e; p++; } else d=0; printf("%6d",d); } } }
矩阵转置实验报告

一、实验目的1. 理解矩阵转置的概念和原理。
2. 掌握稀疏矩阵的三元组表示方法。
3. 实现稀疏矩阵的转置算法,并对比传统转置算法和快速转置算法的性能。
4. 提高对数据结构中稀疏矩阵处理方法的理解和应用能力。
二、实验环境1. 操作系统:Windows 102. 编程语言:C++3. 开发工具:Visual Studio 20194. 稀疏矩阵存储结构:三元组三、实验原理矩阵转置是指将矩阵的行和列互换位置,得到的新矩阵称为原矩阵的转置矩阵。
对于稀疏矩阵,由于其非零元素较少,使用三元组表示方法可以有效地存储和操作稀疏矩阵。
四、实验内容1. 稀疏矩阵的三元组表示方法:定义三元组结构体,包括行号、列号和元素值。
2. 稀疏矩阵的输入:从文件中读取稀疏矩阵的三元组数据。
3. 稀疏矩阵的传统转置算法:按行优先顺序遍历原矩阵,将非零元素的三元组信息插入到转置矩阵的三元组中。
4. 稀疏矩阵的快速转置算法:利用行压缩技术,减少转置过程中的重复计算,提高算法效率。
5. 转置矩阵的输出:将转置矩阵的三元组信息按照矩阵形式输出。
五、实验步骤1. 定义三元组结构体:```cppstruct Triple {int i; // 行号int j; // 列号double e; // 元素值};```2. 创建稀疏矩阵:```cppvoid CreateSparseMatrix(Triple& data, int& m, int& n, int& tu) { // 从文件中读取稀疏矩阵的三元组数据// ...}```3. 传统转置算法:```cppvoid TransposeMatrix(Triple& data, int& m, int& n, int& tu) {Triple t[MAXSIZE];int k = 0;for (int i = 1; i <= m; ++i) {for (int j = 1; j <= n; ++j) {if (data[i].j == j) {t[k].i = data[i].j;t[k].j = data[i].i;t[k].e = data[i].e;++k;}}}// 将t复制到data中// ...}```4. 快速转置算法:```cppvoid FastTransposeMatrix(Triple& data, int& m, int& n, int& tu) { // 利用行压缩技术,减少转置过程中的重复计算// ...}```5. 输出转置矩阵:```cppvoid PrintMatrix(Triple& data, int& m, int& n, int& tu) {// 按矩阵形式输出转置矩阵的三元组信息// ...}```六、实验结果与分析1. 实验结果:通过实验,成功实现了稀疏矩阵的传统转置算法和快速转置算法,并验证了算法的正确性。
稀疏矩阵一次快速转置

西安邮电学院数据结构实验报告稀疏矩阵一次定位快速转置班级:班内序号:学生姓名:指导教师:时间:目录一、实验目的 (2)二、实验内容 (2)三、数据结构及算法思想 (2)1、对各个模块进行功能的描述 (2)2、模块之间关系及其相互调用的图示 (3)五、详细设计及运行结果 (3)1、设计源代码: (3)2、运行结果: (5)六、调试情况,设计技巧及体会 (5)一、实验目的1、进一步理解数组这个我们十分熟悉的结构,并了解在计数机内部是如何处理数组的。
2、熟悉并掌握特殊矩阵的定义和分类,并掌握它们的一种压缩存储方法。
3、理解并运用三元组表示方法压缩稀疏矩阵,通过“一次定位快速转置”法实现稀疏矩阵的转置。
二、实验内容运用“一次定位快速转置”实现对一个已知行、列及非零元素个数的稀疏矩阵的三元组表表示的转置。
三、数据结构及算法思想“一次定位快速转置”即将被转置的三元组表A的元素一次定位到三元组表B的正确位置上,具体做法为:用position[col]的初值表示三元组A中第col列中第一个非零元素的正确位置,当三元组A中第col列有一个元素加入到三元组表B时,则position[col]= position[col]+1,使position[col]始终指向三元组表A中第col列中下一个非零元素在三元素表B中的正确位置。
四、模块划分1、对各个模块进行功能的描述本次设计共分为三个模块,分别是输入模块、转置模块、显示模块。
各个模块功能如下表。
2、模块之间关系及其相互调用的图示图1五、详细设计及运行结果1、设计源代码:#include"stdio.h"#include"malloc.h"#define MAXSIZE 1000typedef struct{int row,col; int e;}Triple;typedef struct{Triple data[MAXSIZE+1]; int m,n,len;}TSMatrix;void FastTransposeTSMatrix(TSMatrix A,TSMatrix *B){int col,t,p,q;int num[MAXSIZE],position[MAXSIZE];B->len=A.len; B->n=A.m; B->m=A.n;if(B->len){for(col=1;col<=A.n;col++)num[col]=0;for(t=1;t<=A.len;t++)num[A.data[t].col]++;position[1]=1;for(col=2;col<=A.n;col++)position[col]=position[col-1]+num[col-1];for(p=1;p<=A.len;p++){col=A.data[p].col;q=position[col];B->data[q].row=A.data[p].col;B->data[q].col=A.data[p].row;B->data[q].e=A.data[p].e;position[col]++;}}}main(){TSMatrix M;TSMatrix *N=(TSMatrix *)malloc(sizeof(TSMatrix));int i;printf("请输入稀疏矩阵的行列数和非零元素的个数:\n");scanf("%d%d%d",&M.m,&M.n,&M.len);printf("请输入非零元素的位置下标和元素值:\n");for(i=1;i<=M.len;i++)scanf("%d%d%d",&M.data[i].row,&M.data[i].col,&M.data[i].e);printf("\n稀疏矩阵的三元组表示:");for(i=1;i<=M.len;i++)printf("\n%d %d %d",M.data[i].row,M.data[i].col,M.data[i].e);FastTransposeTSMatrix(M,N);printf("\n转置后的三元组:");for(i=1;i<=N->len;i++)printf("\n%d %d %d",N->data[i].row,N->data[i].col,N->data[i].e);getch();}2、运行结果:图 2六、调试情况,设计技巧及体会通过这次稀疏矩阵的“一次定位快速转置”设计的练习,我更充分掌握和理解了数组这一数据结构类型,并学习了特殊矩阵的压缩存储方法,体会到完一个程序,只是完成一个设计的一小部分,后期的调试和验证也是重要的一部分,这次设计完成代码后编译都没错,但运行结果却不正确,通过调试后才的找出错误,运行成功,但经过一些数据的验证却又发现问题,最后才发现是有个地方少输入一个“=”的原因,经过改正后结果就正确了,所以一个设计的完成是需要不断的改进、调试和验证的,其中耐心和细心更是不可缺少的。
转置矩阵实验报告

一、实验目的1. 理解矩阵转置的概念和性质。
2. 掌握矩阵转置的计算方法,包括普通矩阵和稀疏矩阵的转置。
3. 通过编程实现矩阵转置算法,并分析算法的复杂度。
4. 理解矩阵转置在数值计算中的应用。
二、实验原理矩阵转置是指将矩阵的行和列互换位置得到的新矩阵。
对于任意矩阵 \( A \) ,其转置矩阵记为 \( A^T \) 。
如果 \( A \) 是一个 \( m \times n \) 的矩阵,那么 \( A^T \) 是一个 \( n \times m \) 的矩阵。
三、实验内容1. 普通矩阵转置- 使用二维数组存储矩阵,实现普通矩阵的转置。
- 输入一个 \( m \times n \) 的矩阵,输出其转置矩阵 \( A^T \) 。
2. 稀疏矩阵转置- 使用三元组表示稀疏矩阵,实现稀疏矩阵的转置。
- 输入一个稀疏矩阵,输出其转置矩阵 \( A^T \) 。
3. 算法分析- 分析普通矩阵转置和稀疏矩阵转置算法的时间复杂度。
- 比较两种算法在处理不同类型矩阵时的效率。
四、实验步骤1. 普通矩阵转置- 定义一个二维数组 \( A \) 存储矩阵元素。
- 输入矩阵 \( A \) 的行数 \( m \) 和列数 \( n \) 。
- 输入矩阵 \( A \) 的元素。
- 遍历数组 \( A \),将元素 \( A[i][j] \) 放入新数组 \( A^T[j][i] \) 。
- 输出转置矩阵 \( A^T \) 。
2. 稀疏矩阵转置- 定义一个结构体存储三元组,包括行号、列号和元素值。
- 输入稀疏矩阵的非零元素个数 \( t \) ,行数 \( m \) 和列数 \( n \) 。
- 输入稀疏矩阵的三元组表示。
- 遍历三元组表,将每个三元组 \( (i, j, e) \) 改为 \( (j, i, e) \) 。
- 输出转置矩阵 \( A^T \) 的三元组表示。
3. 算法分析- 普通矩阵转置的时间复杂度为 \( O(mn) \) ,空间复杂度为 \( O(mn) \) 。
数据结构实验报告-特殊矩阵和稀疏矩阵

实验五特殊矩阵和稀疏矩阵【实验目的】1、掌握数组的结构类型(静态的内存空间配置);通过数组的引用下标转换成该数据在内存中的地址;2、掌握对称矩阵的压缩存储表示;3、掌握稀疏矩阵的压缩存储-三元组表表示,以及稀疏矩阵的转置算法。
【实验学时】2学时【实验预习】回答以下问题:1、什么是对称矩阵?写出对称矩阵压缩存储sa[k]与aij之间的对应关系。
2、什么是稀疏矩阵?稀疏矩阵的三元组表表示。
【实验内容和要求】1、编写程序exp5_1.c,将对称矩阵进行压缩存储。
(1)对称矩阵数组元素A[i][j]转换成为以行为主的一维数组sa[k],请描述k与ij的关系。
(注意C程序中,i,j,k均从0开始)(2)调试程序与运行。
对称矩阵存储下三角部分即i>=j。
对称矩阵为3,9,1,4,79,5,2,5,81,2,5,2,44,5,2,1,77,8,4,7,9参考程序如下:#include<stdio.h>#define N 5int main(){int upper[N][N]= {{3,9,1,4,7},{9,5,2,5,8},{1,2,5,2,4},{4,5,2,1,7},{7,8,4,7,9}}; /*对称矩阵*/int rowMajor[15]; /*存储转换数据后以行为主的数组*/int Index; /*数组的索引值*/int i,j;printf("Two dimensional upper triangular array:\n");for (i=0; i<N; i++) /*输出对称矩阵*/{for(j=0; j<N; j++)printf("%3d",upper[i][j]);printf("\n");}for(i=0; i<N; i++) /*进行压缩存储*/for(j=0; j<N; j++)if(____i>=j_____) /*下三角元素进行存储*/{Index=______i*(i+1)/2+j______; /*ij与index的转换*/rowMajor[Index]=upper[i][j];}printf("\nRow Major one dimensional array:\n");for(i=0; i<15; i++) /*输出转换后的一维数组*/printf("%3d", rowMajor[i]);printf("\n");return 1;}2、完成程序exp5_2.c,实现稀疏矩阵的三元组表存储及稀疏矩阵的转置。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{ col=M->data[p].j; q=cpot[col];
T->data[q].i=M->data[p].j;
T->data[q].j=M->data[p].i;
T->data[q].e=M->data[p].e;
++cpot[col];
}
}
printf("\n\nzhuan zhi hou de san yuan zu biao shi wei :\n\n");
creatarray 函数中又定义了一个局部变量 a,导致有如上的警告提示。最后将局部变量
a 改为 c 就可以了。
⒉ 编译时的错误一大堆,但是致命的是在关键的函数快速转置有错误,在运行的结果中不
是自己想要的结果。在一一排除的情况下,数组转换三元组是正确的只是 fasttrans 函
数算法有错,如出现下图的错误:
}3.主函数和其他函数的伪码算法 void main() { Tsmatrix *M,*T;
3
M=(Tsmatrix *)malloc(sizeof(Tsmatrix));
T=(Tsmatrix *)malloc(sizeof(Tsmatrix));
printf("please input array's row and col:\n");
int i,j; int e; }Triple; typedef struct{ Triple data[MAXSIZE+1]; int mu,nu,tu;
} Tsmatrix;
2.对抽象数据类型中的部分基本操作的伪码算法如下: Tsmatrix * creatarray(Tsmatrix *M) { int m,n,p=1;
{ int m,n,p=1;
int d;
for(m=1;m<=x;m++)
{ printf("\n");
for(n=1;n<=y;n++)
{ if(T->data[p].i==m&&T->data[p].j==n)
{ d=T->data[p].e;
p++;
}
else d=0;
printf("%6d",d);
for(n=1;n<=b;n++) { scanf("%d",&c); if(c!=0) { M->data[p].e=c; M->data[p].i=m; M->data[p].j=n; p++; } }
M->tu=p; M->mu=a; M->nu=b; printf("yuan lai san yuan zu de biao shi wei :\n\n"); for(m=1;m<=M->tu;m++)
}
}
}
void main()
{ Tsmatrix *M,*T;
M=(Tsmatrix *)malloc(sizeof(Tsmatrix));
T=(Tsmatrix *)malloc(sizeof(Tsmatrix));
{ for(col=1;col<=M->nu;col++) num[col]=0; for(t=1;t<=M->tu;t++) ++num[M->data[t].j]; cpot[1]=1; for(col=2;col<=M->nu;col++) cpot[col]=cpot[col-1]+num[col-1]; for(p=1;p<=M->tu;++p)
六、测试结果
所以在 TC2.0 中运行得到的结果如下图所示: (1)我输入的稀疏矩阵为:
(2)回车显示的结果是:
七、附录:源程序 #include<stdio.h> #define MAXSIZE 100 typedef struct {
int i,j;
5
int e; }Triple; typedef struct{
scanf("%d%d",&a,&b);
/*输入行列数*/
M=creatarray(M); /*创建稀疏矩阵*/
printf("you had creat the array:\n");
print(M,a,b);
/*输出创建好的三元组*/
T=fasttrans(M,T); /*将三元组转置*/
printf("the trans array is:\n");
2
Tsmatrix * fasttrans(Tsmatrix *M,Tsmatrix *T) { int p,col,q,t,m; int num[100]; int cpot[100]; T->mu=M->nu; T->nu=M->mu; T->tu=M->tu; if(T->tu!=0) { for(col=1;col<=M->nu;col++) num[col]=0; for(t=1;t<=M->tu;t++) ++num[M->data[t].j]; cpot[1]=1; for(col=2;col<=M->nu;col++) cpot[col]=cpot[col-1]+num[col-1]; for(p=1;p<=M->tu;++p) { col=M->data[p].j; q=cpot[col]; T->data[q].i=M->data[p].j; T->data[q].j=M->data[p].i; T->data[q].e=M->data[p].e; ++cpot[col]; } } printf("\n\nzhuan zhi hou de san yuan zu biao shi wei :\n\n"); for(m=1;m<=T->tu;m++) printf("%3d%3d%3d\t",T->data[m].i,T->data[m].j,T->data[m].e); printf("\n"); return T; } /*输出三元组函数*/ void print(Tsmatrix *T,int x,int y) { int m,n,p=1; int d; for(m=1;m<=x;m++) { printf("\n"); for(n=1;n<=y;n++) { if(T->data[p].i==m&&T->data[p].j==n) { d=T->data[p].e; p++; } else d=0; printf("%6d",d); } } }
二、概要设计
⒈ 为实现上述算法,需要线性表的抽象数据类型: ADT SparseMatrix { 数据对象:D={aij:|aij∈TermSet,i=1…m,m≥0,j=1…n,n≥0 m 和 n 分别成为矩阵的行数和列数 } 数据关系:R={Row,Col} Row ={<ai,j,ai,j+1>|1≤i≤m,1≤j≤n-1 } Col ={<ai,j,ai+1,j>|1≤i≤m-1,1≤j≤n } 基本操作: CreateSMtrix(& M) 操作结果:创建稀疏矩阵 M。 DestroySMaix(&M) 初始条件:稀疏矩阵 M 已存在。 操作结果:销毁稀疏矩阵 M。 PrintSMatrix(L) 初始条件:稀疏矩阵 M 已经存在。 操作结果:输出稀疏矩阵 M。 CopySMatrix(M,&T) 初始条件:稀疏矩阵 M 已经存在。 操作结果:由稀疏矩阵 M 复制得到 T。 TransposeSMatrix(M,&T) 初始条件:稀疏矩阵 M 已经存在。
1
操作结果:求稀疏矩阵 M 的转转矩阵 T。
}ADT SparseMatrix
2. 本程序有三个模块:
⑴ 主程序模块 main(){ 初始化; { 接受命令; 显示结果; }
} ⑵ 矩阵压缩存储单元模块:实现链表抽象数据类型操作,即函数的定义模块;
三、详细设计
⒈元素类型,结点类型 typedef struct {
4. 算法的时空分析
各操作的算法时间复杂度比较合理 Creatarray,print 为 O(a*b) 其中 a 和 b 分别表示稀疏矩阵的行列数
4
fasttrans 为 O(tu) 其中 tu 表示稀疏矩阵中的非零个数
5.本次实验采用数据抽象的程序设计方法,将程序化为三层次结构,设计时思路清晰,使
最后发现原来的该函数的代码的算法少了几条语句。
3.因为要将稀疏矩阵 M 和稀疏矩阵 T 分别调用函数 print,所以设计 print 函数的时候发现
形参不仅仅要稀疏矩阵而且还应该有盖稀疏矩阵的行列数才能正确的输出稀疏矩阵,最 后定义为 print(Tsmatrix *T,int x,int y)才实现了输出。
调试也较顺利,各模块有较好的可重用性。
五、用户手册
⒈ 本程序的运行环境为 windows xp 操作系统,并且在 TC2.0 中运行,执行文件为 Exp2Prb5.c;