稀疏矩阵的运算课程设计

合集下载

课程设计 稀疏矩阵应用

课程设计  稀疏矩阵应用

数学与计算机学院课程设计说明书课程名称: 数据结构课程设计课程代码: 8404181题目: 稀疏矩阵应用年级/专业/班:学生姓名:学号:开始时间:2011 年06 月13日完成时间:2011 年06月21 日课程设计成绩:学习态度及平时成绩(30)技术水平与实际能力(20)创新(5)说明书撰写质量(45)总分(100)指导教师签名:年月日目录1 引言 (1)1.1问题的提出 (1)1.2国内外研究的现状 (1)1.3任务与分析 (1)2 程序的主要功能 (1)2.1三元组的转置 (1)2.2三元组的加法 (1)2.3三元组的减法 (1)2.4三元组的乘法 (2)2.5十字链表的转置 (2)2.6十字链表的加法 (2)2.7十字链表的减法 (2)2.8十字链表的乘法 (2)3程序运行平台 (3)4总体设计 (3)5程序类的说明 (4)6 模块分析 (5)6.1三元组的转置 (5)6.2三元组减法 (6)6.3三元组的减法 (9)6.4三元组的乘法 (12)6.5十字链表的转置 (14)6.6十字链表的加法 (15)6.7十字链表的减法 (18)6.8十字链表的乘法 (22)7 系统测试 (25)7.1三元组的转置 (25)7.2三元组的加法 (26)7.3三元组的减法 (26)7.4三元组的乘法 (27)7.5十字链表的转置 (27)7.6十字链表的加法 (28)7.7十字链表的减法 (28)7.8十字链表的乘法 (29)7.9总结 (29)8结论 (29)参考文献 (29)摘要随着计算机的普及,一句话引出题目…(小四楷体_GB2312),分析了三元组和十字链表的存储和各种运算的实现,利用C语言编程实现了稀疏矩阵的运算系统,该系统具有三元组十字链表存储下的稀疏矩阵转置、加法、减法、乘法的功能。

关键词:稀疏矩阵;计算机; 运算器1 引言1.1 问题的提出矩阵是很多科学与工程计算问题中研究的数学对象。

稀疏矩阵课程设计

稀疏矩阵课程设计

数据结构课程设计设计说明书稀疏矩阵相关操作的实现学生姓名学号班级成绩指导教师数学与计算机科学学院2014年1月5日课程设计任务书2013—2014学年第1学期专业:学号:姓名:课程设计名称:课程设计Ⅰ设计题目:稀疏矩阵相关操作的实现完成期限:自年月日至年月日共周设计内容:若矩阵非零元较零元少,且分布没有一定规律,则称之为稀疏矩阵。

运用C、JA V A、VC++编程工具,编程实现稀疏矩阵的相关操作。

要求:1)阐述设计思想,画出流程图;2)主要功能:(1)输入相关数据建立稀疏矩阵;(2)实现稀疏矩阵转置;(3)实现两个稀疏矩阵相乘。

3)从时间、空间对算法分析;4)较好的界面设计;5)编写课程设计报告。

以上要求中第一个阶段的任务完成后,先将设计说明书的草稿交指导老师面审,审查合格后方可进入后续阶段的工作。

设计工作结束后,经指导老师验收合格后将设计说明书打印装订,并进行答辩。

指导教师(签字):教研室负责人:批准日期:年月日课程设计评阅摘要本文以VC++作为软件开发环境,三元组表作为存储结构,设计与实现了稀疏矩阵运算器。

该计算器实现简单稀疏矩阵的乘法、转置、相乘等主要功能。

计算器。

界面清晰,操作简单,易于为用户所接受。

关键词:VC++;三元表;乘法;转置目录一、课题描述 (1)二、问题描述 (2)2.1 问题指出 (2)2.2 问题需求 (2)2.3 测试数据 (2)2.4 问题阐述 (2)三、算法描述 (3)3.1 定义结构 (3)3.2 实现功能 (3)四、算法流程图 (5)五、算法实现 (6)5.1 菜单模块 (6)5.2 建立矩阵模块 (7)5.3 输出矩阵 (8)5.4 转置矩阵 (9)5.5 矩阵相乘 (9)六、运行程序 (12)6.1 菜单界面 (12)6.2 建立矩阵 (12)6.3 矩阵转置 (13)6.4 矩阵相乘 (13)七、时间及空间复杂度分析 (15)八、总结 (16)参考文献 (17)一、课题描述稀疏矩阵是指那些多数元素为零的矩阵。

数据结构+课程设计+稀疏矩阵的操作(计算机学院)

数据结构+课程设计+稀疏矩阵的操作(计算机学院)

计算机科学技术学院学生课程设计(论文)题目:学生姓名:学号:所在院(系):专业:班级:指导教师:职称:年月日计算机科学技术学院本科学生课程设计任务书注:任务书由指导教师填写。

课程设计(论文)指导教师成绩评定表稀疏矩阵的操作1.课程设计的目的本课程设计是为了配合《数据结构》课程的开设,通过设计一完整的程序,使学生掌握数据结构的应用、算法的编写、类C语言的算法转换成C程序并用TC上机调试的基本方法。

利用三元组实现稀疏矩阵的有关算法。

2.问题描述2.1稀疏矩阵采用三元组表示,求两个具有相同行列数的稀疏矩阵A和B的相加矩阵C,并输出C。

2.2求出A的转置矩阵D,输出D。

3. 基本要求稀疏矩阵是指那些多数元素为零的矩阵。

利用“稀疏”特点进行存储和计算可以大大节省存储空间,提高计算效率。

实现一个能进行稀疏矩阵基本运算的运算器。

以“带行逻辑链接信息”的三元组顺序表表示稀疏矩阵,实现两个矩阵相加、相减和相乘的运算。

稀疏矩阵的输入形式采用三元组表示,而运算结果的矩阵则通常以阵列形式列出。

4.结构设计4.1.以“带行逻辑链接信息”的三元组顺序表表示稀疏矩阵,实现两个矩阵相加、相减和相乘的运算。

4.2.稀疏矩阵的输入形式采用三元组表示,而运算结果的矩阵则通常以阵列形式列出。

4.3.首先应输入矩阵的行数和列数,并判别给出的两个矩阵的行、列数对于所要求作的运算是否相匹配。

可设矩阵的行数和列数均不超过20。

4.4.程序可以对三元组的输入顺序加以限制,例如,按行优先。

注意研究教材的算法,以便提高计算效率。

5.在用三元组表示稀疏矩阵时,相加或相减所得结果矩阵应该另生成,乘积矩阵也可用二维数组存放5.算法思想5.1.主函数设置循环和选择语句进行运算循环和选择,进行稀疏矩阵的加法,减法,乘法,转置和是否继续运算5个分支开关进行运算选择。

5.2.设置函数分别实现稀疏矩阵的输入,输出,加法,减法,乘法。

5.3.在数组结构体中设置存放每行第一个非零元在其数组存储结构单元的位置的存储单元,若该行无非零元,则存为06.模块划分6.1typedef struct存放各行第一个非零元在存储数组中的位置,若该行无非零元,则其rpos[]值为零6.2 createsmatrix(rlsmatrix *M) 矩阵输入函数,输入各行非零元及其在矩阵中的行列数6.3 FasttransposeRLSMatrix(RLSMatrix M,RLSMatrix *Q) 矩阵快速转置6.4 HeRLSMatrix(RLSMatrix *M,RLSMatrix *N,RLSMatrix *Q) 矩阵求和6.5 ChaRLSMatrix(RLSMatrix *M,RLSMatrix *N,RLSMatrix *Q) 矩阵求差6.6 JiRLSMatrix(RLSMatrix M,RLSMatrix N,RLSMatrix *Q) 矩阵求积7.算法实现7.1首先定义非零元个数的最大值和存放各行第一个非零元在存储数组中的位置#include<stdio.h>#define MAXSIZE 100 /* 非零元个数的最大值*/typedef struct triple{int i,j; /* 行下标,列下标*/int e; /* 非零元素值*/}triple;typedef struct tsmatrix{triple data[MAXSIZE+1]; /* 非零元三元组表,data[0]未用*/int mu,nu,tu; /* 矩阵的行数、列数和非零元个数*//* 各列第一个非零元的位置表rpos[0]未用*/}rlsmatrix;7.2创建稀疏矩阵矩阵的行数,列数,和非零元素的个数并按行序顺序输入第%d 个非零元素所在的行(1~%d),列(1~%d),元素值。

数据结构实验报告三稀疏矩阵的运算

数据结构实验报告三稀疏矩阵的运算

数据结构实验报告三稀疏矩阵的运算实验课程名称数据结构课程设计专业班级学⽣姓名学号指导教师2012 ⾄ 2013 学年第⼀学期第 1 ⾄ 18 周⽬录实验题⽬:稀疏矩阵的运算 (3)⼀:概述 (3)⼆:系统分析 (3)三:概要设计 (3)四:详细设计 (4)五:运⾏与测试 (9)六:总结与⼼得 (9)实验题⽬:稀疏矩阵的运算⼀:概述本实验设计主要实现在⼗字链表存储结构输⼊稀疏矩阵,并对稀疏矩阵进⾏相加操作,最后输出运算结果。

⼆:系统分析本实验要求设计函数在⼗字链表结构下建⽴稀疏矩阵并初始化,在创建稀疏矩阵时,需要设计在⼗字链表下创建稀疏矩阵,在输⼊出现错误时,能够对错误进⾏判别处理,初始化稀疏矩阵都为空值。

在设计输出稀疏矩阵的值的函数时,根据情况编制函数,才能准确的输出稀疏矩阵。

在对稀疏矩阵进⾏初始化时,只输⼊⾮零元素的值和它所在的所在⾏及所在列。

在对稀疏矩阵输出时,以矩阵的完整形式输出。

除此之外还要求设计相加对两个矩阵进⾏运算,并输出最终的稀疏矩阵,定义相应的矩阵类型⽤于存放两个矩阵操作后的结果矩阵,这个结果矩阵的⾏、列数需要综合多⽅⾯情况来确定。

这些函数也是整个程序的难点,需要灵活运⽤数组及指针的特点。

三:概要设计⼗字链表结构体定义:typedef struct sex{int row,col,val; //⾮零元素的⾏、列下标及值struct sex *right,*dowm; //该⾮零元素所在⾏表和列表的后继元素}Node;矩阵的加法:此功能在⼗字链表存储结构下,由函数void addition(Node *cp1, Node *cp2, Node *cp3)实现。

当⽤户选择该功能,系统即提⽰⽤户初始化要进⾏加法的两个矩阵的信息。

然后进⾏加法,最后输出结果。

四:详细设计#include#includetypedef struct sex{int row,col,val; //⾮零元素的⾏、列下标及值struct sex *right,*dowm; //该⾮零元素所在⾏表和列表的后继元素}Node;Node * Init(int m, int n){int t,i;Node *cp;t=(m>=n)?m:n;cp=(Node *)malloc( (t+1)*sizeof(Node) ); //开辟⼀串连续的内存空间(*cp).row=m;(*cp).col=n;(*cp).val=t; //此表头结点的值域⽤来记录⾏列的最⼤值,以便于后⾯的开辟空间for(i=1;i<=t;i++){cp[i].right=cp+i;cp[i].dowm=cp+i; //构成带表头结点的空循环单链表}return cp;}void CreatCrossList(Node *cp){int t,i;Node *s,*temp;printf("请输⼊⾮零元素的个数N:");scanf("%d",&t);printf("\n请输⼊其对应坐标及元素值:\n");for(i=0;i{s=(Node *)malloc( sizeof(Node));scanf("%d%d%d",&s->row,&(*s).col,&s->val);temp=cp+s->row;if( temp->right!=cp+s->row )while( temp->right!=cp+s->row && temp->right->col<=s->col )temp=temp->right;s->right=temp->right;temp->right=s; //修改⾏链表插⼊位置temp=cp+s->col;if( temp->dowm!=cp+s->col )while( temp->dowm!=cp+s->col && temp->dowm->row<=s->row )temp=temp->dowm;s->dowm=temp->dowm;temp->dowm=s; //修改列链表插⼊位置}}void output(Node *cp){int i;Node *temp;printf("\n稀疏矩阵如下:\n");for(i=1;i<=cp->row;i++){temp=cp+i;while( temp->right!=cp+i ){printf("(%d,%d %d)",temp->right->row,temp->right->col,temp->right->val); temp=temp->right;}printf("\n");}}void Insert(Node *cp, Node *s){//此插⼊函数的作⽤是:⽣成⽬标矩阵Node *temp;temp=cp+s->row; //修改⾏链表指针if( temp->right!=cp+s->row )while( temp->right!=cp+s->row && temp->right->col<=s->col ) temp=temp->right;s->right=temp->right;temp->right=s;temp=cp+s->col; //修改列链表指针if( temp->dowm!=cp+s->col )while( temp->dowm!=cp+s->col && temp->dowm->row<=s->row ) temp=temp->dowm;s->dowm=temp->dowm;temp->dowm=s;}void addition(Node *cp1, Node *cp2, Node *cp3){int i;Node *w,*p,*q;for( i=1; i<=cp2->row && i<=cp3->row; i++){p=cp2+i;q=cp3+i;while( p->right!=cp2+i && q->right!=cp3+i ){w=(Node *)malloc( sizeof(Node) );w->row=p->right->row;if( p->right->col==q->right->col ){w->col=p->right->col;w->val=p->right->val+q->right->val; //相同位置上的元素值相加p=p->right;q=q->right;if( w->val )Insert(cp1,w); //把⾮零元插⼊到⽬标矩阵中}else if( p->right->colright->col ){w->col=p->right->col;w->val=p->right->val;p=p->right;Insert(cp1,w); //把cp2中的⾮零元插⼊到⽬标矩阵中}else{w->col=q->right->col;w->val=q->right->val;q=q->right;Insert(cp1,w); //把cp2中的⾮零元插⼊到⽬标矩阵中}}if( p->right==cp2+i )while( q->right!=cp3+i ){w=(Node *)malloc( sizeof(Node) );w->row=q->right->row;w->col=q->right->col;w->val=q->right->val;q=q->right;Insert(cp1,w); //把cp3中剩余的⾮零元插⼊⽬标矩阵中} else if( q->right==cp3+i )while( p->right!=cp2+i ){w=(Node *)malloc( sizeof(Node) );w->row=p->right->row;w->col=p->right->col;w->val=p->right->val;p=p->right;Insert(cp1,w); //把cp2中剩余的⾮零元插⼊到⽬标矩阵中} else; //两个矩阵同⼀⾏中同时结束}if( i>cp2->row)while(i<=cp3->row){//把cp3中剩余⾏中的⾮零元插⼊到⽬标矩阵中q=cp3+i;while( q->right!=cp3+i ){w=(Node *)malloc( sizeof(Node) );w->row=q->right->row;w->col=q->right->col;w->val=q->right->val;q=q->right;Insert(cp1,w);}i++; //继续下⼀⾏}else if(i>cp3->row)while( i<=cp2->row ){p=cp2+i;while( p->right!=cp2+i ){w=(Node *)malloc( sizeof(Node) );w->row=p->right->row;w->col=p->right->col;w->val=p->right->val;p=p->right;Insert(cp1,w);}i++; //继续下⼀⾏}}int main(){Node *cp1, *cp2, *cp3;int a, b;printf("\t\t\t*****稀疏矩阵的加法*****\n\n");printf("请输⼊cp2的⾏、列数:");scanf("%d%d",&a,&b);cp2=Init(a,b);printf("请输⼊cp3的⾏、列数:");scanf("%d%d",&a,&b);cp3=Init(a,b);a=cp2->row>=cp3->row?cp2->row:cp3->row;b=cp2->col>=cp3->col?cp2->col:cp3->col;cp1=Init(a,b); //开始初始化结果矩阵printf("\n\t>>>>>>>创建稀疏矩阵cp2\n");CreatCrossList(cp2);printf("\n\t>>>>>>>创建稀疏矩阵cp3\n");CreatCrossList(cp3);output(cp2);output(cp3);addition(cp1,cp2,cp3);printf("\n\n相加后的"); output(cp1);return 0;}五:运⾏与测试进⾏数据测试六:总结与⼼得⼗字链表作为存储结构表⽰随机稀疏矩阵,进⾏两矩阵的相加运算,所以⾸先要定义⼀个⼗字链表作为存储结构。

稀疏矩阵运算器-数据结构课程设计

稀疏矩阵运算器-数据结构课程设计

实习4、稀疏矩阵运算器一、需求分析1. 问题描述稀疏矩阵是指那些多数元素为零的矩阵。

利用“稀疏”特点进行存储和计算可以大大节省存储空间,提高计算效率。

实现一个能进行稀疏矩阵基本运算的运算器。

2. 基本要求以带“行逻辑连接信息”的三元组顺序表表示稀疏矩阵,实现两个矩阵的相加、相减和相乘运算。

稀疏矩阵的输入形式采用三元组表示,而运算结果的矩阵则以通常的阵列形式列出。

3. 实现提示(1)首先应输入矩阵的行数和列数,并判别给出的两个矩阵的行、列数对于所要求作的运算是否匹配。

可设聚矩阵的行数和列数不超过20。

(2)程序可以对三元组的输入顺序加以限制,例如,按行优先。

注意研究教科书5.3.2节中的算法,以便提高计算效率。

(3)在用三元组表示稀疏矩阵时,相加或者相减所得的结果矩阵应该另生成,乘积矩阵也可以用二维数组存放。

二、概要设计ADT SparseMatrix{数据对象:D={a ij |i=1,2,3……m;j = 1,2,3……n;a i,j ∈intSet,m 和n 分别称为矩阵的行数和列数}数据关系:R ={ Row,col}Row ={<a i,j ,a i,j+1>|1≤i ≤m ,1≤j ≤n-1}Col = {< a i,j ,a i,j+1>|1≤i ≤m-1,1≤j ≤n}基本操作:CreateSMatrix(*T);操作结果:创建稀疏矩阵T 。

AddRLSMatrix(M,N,*Q);初始条件:稀疏矩阵M 和N 的行数列数对应相等。

操作结果:求稀疏矩阵的和Q=M+N 。

SubRLSSMatrix(M,N,*Q);初始条件:稀疏矩阵M 和N 的行数列数对应相等。

操作结果:求稀疏矩阵的差Q=M-N 。

SMatrixrpos(*T)初始条件:稀疏矩阵T 存在。

操作结果:求稀疏矩阵的各行第一个非零元的位置表。

MulTSMatrix(M,N,*Q);初始条件:稀疏矩阵M 的列数与N 的行数对应相等。

三元组顺序表稀疏矩阵课程设计报告(不完整)

三元组顺序表稀疏矩阵课程设计报告(不完整)

1.稀疏矩阵运算器数据结构课程设计任务书针对本课程设计,完成以下课程设计任务:1、熟悉系统实现工具和上机环境。

2、根据课程设计任务,查阅相关资料。

3、针对所选课题完成以下工作:(1)需求分析(2)概要分析(3)详细设计(4)编写源程序(5)静态走查程序和上机调试程序4、书写上述文档和撰写课程设计报告。

3.课程设计报告目录4.正文(1)问题描述稀疏矩阵是指那些多数元素为零的矩阵。

利用“稀疏”特点进行存储和计算可以大大节省存储空间,提高计算频率。

实现一个能进行稀疏矩阵基本运算的运算器。

(2)需求分析本课程设计的稀疏矩阵运算器在visual studio 2013下运行调试成功,可以实现的功能有:1.矩阵运算方式选择2.根据提示输入相应数据3.显示最终结果使用的主要存储结构为三元组,并用三元组形式进行运算。

所有参与运算数据类型为整形,因此输入的数据应为整形数据。

为了节省存储空间使用三元组数据进行运算,可以通过多次扫描三元组数据来实现,即使用嵌套循环函数。

输出结果为通常的阵列形式,因此使用了右对齐,保证输出形式的整齐。

(3)概要分析本次课程设计中定义的结构体typedef struct {int i, j;//矩阵元素所在行列int v;//元素的值}triple;typedef struct {triple data[MAXSIZE];triple cop[MAXSIZE];//辅助数组int m, n, t;//矩阵的行列数}tripletable;Main函数调用子函数时输入1为调用int Push_juzhen(int m, int n, int count)函数,可以实现矩阵相加功能输入2为调用int Dec_juzhen(int m, int n, int count)函数,可实现矩阵相减功能输入3为调用int Mul_juzhen()函数,可以实现矩阵相乘功能(4)详细分析(流程图伪代码)加法函数int Push_juzhen(int m, int n, int count)//矩阵相加(行,列,矩阵数){// p行,q列,s非零元素个数,v元素值//ucount对数组下标计数的变量,与变量x实现多个矩阵相加for (int c = 0; c < count; c++){int x = 0;cout << "请输入第" << c + 1 << "个矩阵的非零元素个数" << endl;cin >> s;cout << "请依次输入非零元素所在行和列以及该非零元素的值并以空格隔开" << endl;for (; x< s; x++)//传递行列及元素值{cin >> p >> q >> v;a.cop[x].i = p;//将p赋值给data[x].ia.cop[x].j = q;//将q赋值给data[x].ja.cop[x].v = v;//将v赋值给data[x].v}//g行//h列for (int g = 1; g <= m;g++)for (int h = 1; h <= n; h++){int l;//存储下标for (l = 0; l < s; l++)//对辅助存储中的三元组进行行逻辑排序,将数据存入a.data{if (a.cop[l].i == g&&a.cop[l].j == h){a.data[u].i = a.cop[l].i;a.data[u].j = a.cop[l].j;a.data[u].v = a.cop[l].v;u++;}}}}//矩阵相加//k为行数//h为列数for (int k = 0; k < u; k++){for (int h = 0; h <= ucount; h++){if (a.data[k].i == b.data[h].i&&a.data[k].j == b.data[h].j)//判断行列是否相等b.data[h].v += a.data[k].v;else{b.data[ucount].i = a.data[k].i;b.data[ucount].j = a.data[k].j;b.data[ucount].v = a.data[k].v;ucount++;//存储空间增加计数}break;//增加一组数据时跳出循环,避免重复计算}}return 0;}相减函数int Dec_juzhen(int m, int n, int count){for (int c = 0; c < count; c++){int x = 0;cout << "请输入第" << c + 1 << "个矩阵的非零元素个数" << endl;cin >> s;cout << "请依次输入非零元素所在行和列以及该非零元素的值并以空格隔开" << endl;for (; x< s; x++)//传递行列及元素值{cin >> p >> q >> v;a.cop[x].i = p;//将p赋值给data[x].ia.cop[x].j = q;//将q赋值给data[x].ja.cop[x].v = v;//将v赋值给data[x].v}//g行//h列if (c != 0){for (int g = 1; g <= m; g++)for (int h = 1; h <= n; h++){int l;//存储下标for (l = 0; l < s; l++)//行逻辑排列{if (a.cop[l].i == g&&a.cop[l].j == h){ a.data[u].i = a.cop[l].i;a.data[u].j = a.cop[l].j;a.data[u].v =- a.cop[l].v;//c>0时为减数矩阵u++;}}}}else{for (int g = 1; g <= m; g++)for (int h = 1; h <= n; h++){int l;//存储下标for (l = 0; l < s; l++){if (a.cop[l].i == g&&a.cop[l].j == h){a.data[u].i = a.cop[l].i;a.data[u].j = a.cop[l].j;a.data[u].v = a.cop[l].v;u++;}}}}}//矩阵减法计算for (int k = 0; k < u; k++){for (int h = 0; h <= ucount; h++){if (a.data[k].i == b.data[h].i&&a.data[k].j == b.data[h].j)//判断行列相等b.data[h].v += a.data[k].v;else{b.data[ucount].i = a.data[k].i;b.data[ucount].j = a.data[k].j;b.data[ucount].v = a.data[k].v;ucount++;}break;}}return 0;}相乘函数int Mul_juzhen(){cout << "请输入第一个矩阵的行列数" << endl;cin >> m >> n;cout << "请输入第一个矩阵的非零元素个数" << endl;cin >> t1;a.m = m;a.n = n;a.t = t1;cout << "请输入第一个矩阵的非零元素所在的行、列、数值并以空格间隔" << endl;for (i=0; i < t1; i++){cin >> p >> q >> v;a.data[i].i = p;//将p赋值给data[x].ia.data[i].j = q;//将q赋值给data[x].ja.data[i].v = v;//将v赋值给data[x].v}cout << "则第二个矩阵的行数为" << a.n << "行" << endl<<endl;cout << "请输入第二个矩阵的列数" << endl;cin >> n;cout << "请输入第二个矩阵的非零元素个数" << endl;cin >> t2;b.m = a.n;b.n = n;b.t = t2;cout << "请输入第二个矩阵的非零元素所在的行、列、数值并以空格间隔" << endl;for (i = 0; i < t2; i++){cin >> p >> q >> v;b.data[i].i = p;//将p赋值给data[x].ib.data[i].j = q;//将q赋值给data[x].jb.data[i].v = v;//将v赋值给data[x].v}i = 0;//i为a、b数组标记,另设k为矩阵相乘元素扫描标记//n为检测相加元素扫描标记,z为存储标记while (i < a.t){int k;for (k = 0; k < b.t; k++){if (a.data[i].j == b.data[k].i)if (i>0){for (n = 0; n < z; n++){if (a.data[i].i == c.data[n].i&&b.data[k].j == c.data[n].j)//判断是否符合相加条件c.data[n].v += a.data[i].v*b.data[k].v;else{c.data[z].i = a.data[i].i;c.data[z].j = b.data[k].j;c.data[z].v = a.data[i].v*b.data[k].v;z++;}}}else{c.data[z].i = a.data[i].i;c.data[z].j= b.data[k].j;c.data[z].v = a.data[i].v*b.data[k].v;z++;}}i++;}return 0;}(5)调试分析(遇到的问题,修改,解决办法,时空复杂度)刚开始,程序仅使用三元组存储,计算过程使用了二维数组,但矩阵相乘会出现错误,矩阵乘法时间复杂度为矩阵一的行数乘以矩阵二的列数(m1*n2)。

数据结构 稀疏矩阵运算器课程设计

数据结构  稀疏矩阵运算器课程设计

数据结构----稀疏矩阵运算器课程设计目录稀疏矩阵运算器设计............................................................................................ I摘要................................................................................................................ ... II第一章需求分析 (1)第二章概要设计 (2)第三章设计步骤 (6)3.1 函数说明 (6)3.2 设计步骤 (7)第四章设计理论分析方法 (20)4.1 算法一:矩阵转置.....................................................................204.2 算法二:矩阵加法.....................................................................204.3 算法三:矩阵乘法 (21)第五章程序调试 (23)第六章心得体会 (25)参考文献 (26)第一章需求分析1.稀疏矩阵是指那些多数元素为零的矩阵。

利用“稀疏”特点进行存储和计算可以大大节省存储空间,提高计算效率。

实现一个能进行稀疏矩阵基本运算的运算器。

2.以“带行逻辑链接信息”的三元组顺序表表示稀疏矩阵,实现矩阵转置,求逆,实现两个矩阵相加、相减和相乘的运算。

稀疏矩阵的输入形式采用三元组表示,而运算结果的矩阵则以通常的阵列形式列出。

3.演示程序以用户和计算机的对话方式执行,数组的建立方式为边输入边建立。

4.由题目要求可知:首先应输入矩阵的行数和列数,并判别给出的两个矩阵的行、列数对于所要求作的运算是否相匹配。

5.程序可以对三元组的输入顺序不加以限制;根据对矩阵的行列,三元组作直接插入排序,从而进行运算时,不会产生错误。

稀疏矩阵(算法与数据结构课程设计)

稀疏矩阵(算法与数据结构课程设计)

稀疏矩阵一、问题描述假若在n m ⨯阶中,有t 个元素不为零,令nm t ⨯=δ称为矩阵的稀疏因子。

通常认为≤δ0.05时称为稀疏矩阵。

稀疏矩阵的研究大大的减少了数据在计算机中存储所需的空间,然而,它们的运算却与普通矩阵有所差异。

通过本次实验实现稀疏矩阵的转置、加法和乘法等多种运算。

二、基本要求1、稀疏矩阵采用三元组表示,建立稀疏矩阵,并能按矩阵和三元组方式输出;2、编写算法,完成稀疏矩阵的转置操作;3、编写算法,完成对两个具有相同行列数的稀疏矩阵进行求和操作;4、编写算法,对前一矩阵行数与后一矩阵列数相等的两个矩阵,完成两个稀疏矩阵的相乘操作。

三、测试数据1、转置操作的测试数据:⎪⎪⎪⎪⎪⎭⎫ ⎝⎛00200013000010020100 2、相加操作的测试数据: ⎪⎪⎪⎪⎪⎭⎫ ⎝⎛00200013000010020100 ⎪⎪⎪⎪⎪⎭⎫ ⎝⎛00200010000210030300 3、相乘操作的测试数据: ⎪⎪⎪⎪⎪⎭⎫ ⎝⎛0000000300400021 ⎪⎪⎪⎪⎪⎭⎫ ⎝⎛001002000021 四、算法思想1、三元组结构类型为Triple ,用i 表示元素的行,j 表示元素的列,e 表示元素值。

稀疏矩阵的结构类型为TSMatrix ,用数组data[]表示三元组,mu 表示行数,nu 表示列数,tu 表示非零元个数。

2、稀疏矩阵转置的算法思想将需要转置的矩阵a 所有元素存储在三元组表a.data 中,按照矩阵a 的列序来转置。

为了找到a的每一列中所有非零元素,需要对其三元组表a.data扫描一遍,由于a.data 是以a的行需序为主序来存放每个非零元的,由此得到的就是a的转置矩阵的三元组表,将其储存在b.data中。

3、稀疏矩阵相加的算法思想比较满足条件(行数及列数都相同的两个矩阵)的两个稀疏矩阵中不为0的元素的行数及列数(即i与j),将i与j都相等的前后两个元素值e相加,保持i,j不变储存在新的三元组中,不等的则分别储存在此新三元组中。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数据结构课程设计说明书题目: 稀疏矩阵的运算院系:计算机科学与工程学院专业班级:计算机10-**班学号: 201030****学生姓名: ******指导教师: ******2011年 12 月 28 日安徽理工大学课程设计(论文)任务书计算机科学与工程学院2011年 11 月 8 日安徽理工大学课程设计(论文)成绩评定表目录1 问题描述 (1)2 需求分析 (1)3 总体设计 (2)3.1 Matrix结构的定义 (2)3.2 系统流程图 (3)4 详细设计 (4)4.1 “菜单”界面 (4)4.2 建立矩阵 (4)4.3 显示矩阵 (6)4.4 矩阵的转置 (7)4.5 矩阵的加法运算 (8)4.6 矩阵的减法运算 (9)4.7 矩阵的乘法运算 (9)5 程序运行 (11)5.1 输入矩阵 (11)5.2 矩阵转置 (11)5.3 矩阵加法 (12)5.4 矩阵减法 (12)5.5 矩阵乘法 (12)5.6 退出及错误提示 (13)6 总结 (13)参考文献 (14)1 问题描述(1)题目内容:设计稀疏矩阵运算系统实现两个稀疏矩阵的加法、减法、乘法以及转置操作。

(2)基本要求:①存储结构选择三元组存储方式;②实现一个稀疏矩阵的转置运算;③实现两个稀疏矩阵的加法运算;④实现两个稀疏矩阵的减法运算;⑤实现两个稀疏矩阵的乘法运算。

(3)设计目的:通过本次课程设计,了解稀疏矩阵的一些基本运算操作,并通过相关的程序代码实现。

2 需求分析经过本次的课程设计,我认为稀疏矩阵运算系统主要实现的功能如下:(1)建立矩阵:只有先建立了矩阵,才能够对矩阵进行运算操作,包括建立矩阵A和矩阵B;(2)转置运算操作:对矩阵A或者矩阵B进行转置运算,输出相应的转置矩阵;(3)四则运算操作:该步骤由两个矩阵同时参与,对其进行加法运算(A+B)、减法运算(A-B)以及乘法运算(A*B和B*A);(4)退出:当做完矩阵的运算操作之后,就可以点击它退出该界面。

在这次设计中用到了一些变量和函数,例如:void Display(Matrix M);int Max(int i,int j);Matrix Zero(Matrix M)等,下面会做进一步详细的介绍。

3 总体设计3.1 Matrix结构的定义struct Matrix{int H; //矩阵的行数int L; //矩阵的列数int fly; //矩阵中的非零元个数int zhi[Maxsize][Maxsize];//非零元值[所在行][所在列] };操作集合:(1)Matrix Enter(Matrix M); //建立矩阵M(2)void Display(Matrix M); //显示矩阵M(3)void Transpose(Matrix M); //M矩阵的转置(4)void Add(Matrix M,Matrix N); //求和运算 A+B(5)void Sub(Matrix M,Matrix N); //求差运算 A-B(5)void Multi(Matrix M,Matrix N); //求积运算 A*B(6)int Max(int i,int j); //求最大值(7)Matrix Zero(Matrix M); //矩阵所有元素赋值为03.2 系统流程图该运算系统的系统流程图如图1所示:图1 系统流程图4 详细设计4.1 “菜单”界面进入稀疏矩阵运算系统后的“菜单”界面如图2所示。

图2 “菜单”界面4.2 建立矩阵矩阵在建立之后才能够进行运算操作,建立矩阵A和矩阵B,调用函数Enter(M),首先根据所输入的矩阵M的行数H和列数L,建立H*L的矩阵M,并且调用函数Zero(M)将其所有元素均赋值为0;其次再根据所输入矩阵M 的非零元个数fly做循环控制变量,按提示输入非零元所在的行h和列l以及非零元的值,如果输入的行h或者列l大于矩阵M的行H或列L,则提示输入错误;最后将非零元的值保存在矩阵M中的相应位置。

程序如下:Matrix Enter(Matrix M) //建立矩阵{cin>>M.H>>M.L;cout<<"请输入矩阵的非零元个数:";cin>>M.fly;cout<<endl;if(M.fly>(M.H*M.L)){cout<<"非零元个数多于矩阵元素总数,请重新输入!"<<endl;cout<<"请重新输入矩阵的非零元个数:";cin>>M.fly;}M=Zero(M);int h;int l;for(int n=1;n<=M.fly;n++) //输入非零元所在的行、列和值{cout<<"请输入第"<<n<<"个非零元所在的行和列:";cin>>h>>l;if(h>M.H||l>M.L) // 行列输入错误提示{cout<<"行列输入错误,请重新输入:"<<endl;cout<<"请重新输入第"<<n<<"个非零元所在的行和列:";cin>>h>>l;}cin>>M.zhi[h][l];cout<<endl;}return M;}注:该函数中调用的Zero()函数的功能为将矩阵M根据行数H和列数L 把所有的元素赋值为0,代码如下:Matrix Zero(Matrix M)//矩阵所有元素赋值为0{for(int i=1;i<=M.H;i++)for(int j=1;j<=M.L;j++)M.zhi[i][j]=0;return M;}4.3 显示矩阵建立好矩阵以后,为了验证所建立的矩阵是否成功,以及在后期运算时矩阵的显示,设计该函数,能更直观的看到输入以及输出的矩阵,代码如下:void Display(Matrix M) //显示矩阵{int count=0;cout<<"矩阵为:"<<endl;for(int i=1;i<=M.H;i++)for(int j=1;j<=M.L;j++){printf("%-4d",M.zhi[i][j]);count++;if(count==M.L){cout<<endl;count=0;}}cout<<endl;}4.4 矩阵的转置该函数实现的是矩阵A或矩阵B的转置操作,通过对矩阵的行和列进行调换,利用for()循环语句实现对矩阵A或矩阵B的转置,其代码如下:void Transpose(Matrix M) //矩阵转置{C.H=M.L;C.L=M.H;cout<<"原来的";Display(M);for(int i=1;i<=M.L;i++)for(int j=1;j<=M.H;j++){C.zhi[i][j]=M.zhi[j][i];}cout<<"转置后的";Display(C);}4.5 矩阵的加法运算实现两个矩阵之间的加法运算,即A+B,其代码如下:void Add(Matrix M,Matrix N) //A+B{int n1=Max(M.H,N.H);int n2=Max(M.L,N.L);C.H=n1;C.L=n2;C=Zero(C);for(int i=1;i<=n1;i++)for(int j=1;j<=n2;j++){C.zhi[i][j]=M.zhi[i][j]+N.zhi[i][j];}cout<<" A+B 的运算结果";Display(C);}4.6 矩阵的减法运算实现两个矩阵之间的减法运算,即A-B,其代码如下:void Sub(Matrix M,Matrix N) //A-B{int n1=Max(M.H,N.H);int n2=Max(M.L,N.L);C.H=n1;C.L=n2;C=Zero(C);for(int i=1;i<=n1;i++)for(int j=1;j<=n2;j++){C.zhi[i][j]=M.zhi[i][j]-N.zhi[i][j];}cout<<" A-B 的运算结果";Display(C);}4.7 矩阵的乘法运算实现两个矩阵之间的乘法运算,即A*B,如果矩阵A的列数和矩阵B的行数不相同,则无法进行乘法运算,系统会提示错误,其代码如下:void Multi(Matrix M,Matrix N) //A*B{if(M.L!=N.H){cout<<"矩阵A的列数和矩阵B的行数不相同,无法进行乘法运算!\n";}elseif(M.L==N.H){C.H=M.H;C.L=N.L;C=Zero(C);for(int i=1;i<=Maxsize;i++)for(int j=1;j<=Maxsize;j++)for(int k=1;k<=Maxsize;k++){C.zhi[i][j]+=M.zhi[i][k]*N.zhi[k][j];}cout<<"运算结果";Display(C);}}5 程序运行5.1 输入矩阵运行该运算系统,进入“菜单”选项以后,输入“1”,选择“输入矩阵A”,运算结果如图3所示;输入“2”,选择“输入矩阵B”,运算结果如图4所示:图3 输入矩阵A 图4 输入矩阵B5.2 矩阵转置输入矩阵A和矩阵B以后,在“菜单”提示下,输入“3”,进行矩阵A的转置,运算结果如图5所示;输入“4”,进行矩阵B的转置,运算结果如图6所示:图5 矩阵A的转置图6 矩阵B的转置5.3 矩阵加法在“菜单”提示下,输入“5”,进行两个矩阵的加法运算,即A+B,运算结果如图7所示:图7 矩阵加法5.4 矩阵减法在“菜单”提示下,输入“6”,进行两个矩阵的加法运算,即A-B,运算结果如图8所示:图8 矩阵减法5.5 矩阵乘法在“菜单”提示下,输入“7”,进行两个矩阵的第一种乘法运算,即A*B,运算结果如图9所示;输入“8”,进行两个矩阵的第二种乘法运算,即B*A,运算结果如图10所示:图9 矩阵乘法1(A*B) 图10 矩阵乘法2(B*A)5.6 退出及错误提示算法在运行时还有退出及错误提示功能,在“菜单”提示下,输入“0”则退出系统,如图11所示;若输入0-8以外的数字,则会出现错误提示,如图12所示:图11 退出图12 错误提示6 总结通过对数据结构这门课的学习,我了解到:“数据结构”在计算机科学中是一门综合性的专业基础课。

相关文档
最新文档