综合训练-稀疏矩阵运算器(完整版)实用资料_第1页
综合训练-稀疏矩阵运算器(完整版)实用资料_第2页
综合训练-稀疏矩阵运算器(完整版)实用资料_第3页
综合训练-稀疏矩阵运算器(完整版)实用资料_第4页
综合训练-稀疏矩阵运算器(完整版)实用资料_第5页
已阅读5页,还剩82页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

综合训练稀疏矩阵运算器(完整版)实用资料(可以直接使用,可编辑完整版实用资料,欢迎下载)

《数据结构》综合训练稀疏矩阵运算器(完整版)实用资料(可以直接使用,可编辑完整版实用资料,欢迎下载)综合训练报告理学院课程设计报告参考格式一、题目:稀疏矩阵运算器二、目的和要求:使学生掌握稀疏矩阵的存储方法及其运算。要求利用C++语言实现一个能实现稀疏矩阵简单运算的程序。具体要求如下:1、采用顺序存储方式。2、提供稀疏矩阵的输入功能。输入方式可以采用三元组方式,也可采用用户直接输入方式等。3、实现稀疏矩阵的转置功能。可以将用户输入的稀疏矩阵进行转置,并将转置后的稀疏矩阵显示到屏幕。4、稀疏矩阵的加法运算功能。提供用户连续输入两个稀疏矩阵的功能,并能将所求的两个稀疏矩阵的和显示出来。5、稀疏矩阵的乘法运算功能。提供用户连续输入两个稀疏矩阵的功能,并能将所求的两个稀疏矩阵的和显示出来。6、稀疏矩阵输出要求输出为完整形式。三、概要设计:稀疏矩阵的顺序储存结构,就是对其相应的三元组线性表进行顺序存储。每个非零元素的三元组用如下结构定义:structTriple{introw,col;ElemTypeval;};其中,row和col用来分别存储元素的行号和列号,val用来存储元素值。一个稀疏矩阵的顺序存储类型定义如下。structSMatrix{intm,n,t;Triplesm[maxterms+1];};其中,m、n和t分别用来存储稀疏矩阵的行数、列数和非零元素的个数,sm数组用来顺序存储每个三元组元素。稀疏矩阵的加法、减法、数乘和乘法模块调用了稀疏矩阵的初始化和输出函数。四、算法描述:1.稀疏矩阵的输入(1)首先把形参m,n传递给稀疏矩阵的行数和列数,确定稀疏矩阵的规模。(2)定义整型变量row,col,val分别用来存储三元组的行号、列号和元素值,定义整型变量k表示第k个三元组元素,其中k初值为零。(3)定义一个while循环,k自加,然后把每次输入的row,col,val的值分别赋值给第k个三元组元素的行号、列号和元素值。(4)当输入完所有的三元组后,以输入特殊的三元组(0,0,0)结束整个输入过程,并且把k的值赋值给稀疏矩阵非零元素的个数。2.稀疏矩阵的输出(1)定义一个二重for循环来输出稀疏矩阵每一行,每一列的元素。(2)在二重for循环中再定义一个for循环来判断每一个非零元素。(3)如果这个非零元素的行号和列号分别与这个二重循环的行数和列数相等,那么就输出这个非零元素的值。否则,就输出零。3.稀疏矩阵的快速转置方法(1)首先把稀疏矩阵的行数、列数和非零元素的个数m,n,t赋值给转置矩阵的列数、行数和非零元数的个数。(2)如果这个矩阵是零矩阵(即非零元素的个数为零的矩阵),那么转换完毕返回。否则,为num和pot向量动态分配存储空间。然后对num向量进行初始化,置每个分量为0.(3)第1遍扫描数组M.sm,统计出每一列(即转换后的每一行)非零元素的个数。(4)计算每一列(即转换后的每一行)的第1个非零元素在S.sm中存储位置。(5)对M.sm进行第2遍扫描,把每个元素行、列值互换写入到S.sm的确定位置。(6)删除动态分配的数组,返回转置矩阵。4.稀疏矩阵的加法运算(方法1)(1)如果两个矩阵尺寸不同,就给出错误信息。(2)否则,把这两个稀疏矩阵线性表上下排列形成一个新的线性表。(3)做一个循环,把这个线性表中具有相同行号和相同列号的元素进行相加,并进行判断。(4)如果相加的结果不为零,那么就把行号、列号和这个值赋值给一个新线性表的三元组的行号、列号和元素值,并且非零元素个数自加。(5)最后,把原来矩阵的尺寸复制给这个新的线性表的规模。那么这个线性表即为所求,输出这个线性表。5.稀疏矩阵的加法运算(方法2)(1)如果两个矩阵尺寸不同,就给出错误信息。(2)否则,定义一个while循环,一直循环到两个稀疏矩阵线性表中的某一个线性表扫描完毕。(3)判断两个线性表中的两个三元组的行号是否相等,如果不相等,就把行号较小的那个三元组传递给一个新的线性表,把较大的三元组在与另一个线性表的下一个三元组再进行比较。(4)如果行号相等的话,再判断两个三元组的列号是否相等。如果不相等,就把列号较小的那个三元组传递给那个新的线性表,把较大的三元组在与另一个线性表的下一个三元组再进行比较。(5)如果列号相等的话,就把两个三元组的元素值相加。(6)如果相加的值不为零,就把这个值赋值给新线性表的一个新的三元组的元素值。把三元组的行号和列号也依次赋值给新三元组的行号和列号。(7)如果相加的值为零,就再比较两个线性表的下一个三元组。(8)当这个while循环循环完毕后,把另一个线性表的剩余元素依次传递给那个新的线性表。(9)这个新的线性表即为所求,输出这个新的稀疏矩阵。6.稀疏矩阵的减法运算(1)如果两个矩阵尺寸不同,就给出错误信息。(2)否则,把这两个稀疏矩阵线性表上下排列形成一个新的线性表。其中,把第二个线性表中的每一个三元组的元素值变为它的相反数。(3)做一个循环,把这个线性表中具有相同行号和相同列号的元素进行相加,并进行判断。(4)如果相加的结果不为零,那么就把行号、列号和这个值赋值给一个新线性表的三元组的行号、列号和元素值,并且非零元素个数自加。(5)最后,把原来矩阵的尺寸复制给这个新的线性表的规模。那么这个线性表即为所求,输出这个线性表。7.稀疏矩阵的数乘运算(1)做一个循环,把每一个三元组的元素值乘以k再赋值给它本身。(2)输出这个线性表。8.稀疏矩阵的乘法运算(1)定义一个二重for循环,外层循环i从1循环到第一个矩阵的最大行数,里层循环c从1循环到第二个矩阵的最大列数。(2)在二重for循环里,再定义一个for循环,扫描第一个线性表中的所有元素,如果有三元组j的行号和二重for循环中的i相等,那么再定义一个for循环,扫描第二个线性表中的所有元素,判断是否有三元组a,使三元组a的行号和三元组j的列号相同,且三元组a的列号和二重for循环中的c相同。(3)如果存在三元组a,那么就把三元组j的元素值和三元组a的元素值相乘再累加。(4)如果这个累加值不为零的话,就把二重for循环中的i、c和步骤(3)中的累加值分别赋值给一个新线性表中的新创建的三元组的行号、列号和元素值。(5)这个新的线性表即为所求,输出这个线性表。五、测试结果及分析:1.测试数据测试的数据如下图所示:经检验,输出的结果是正确的。2.时间复杂度分析(1)稀疏矩阵的快速转置方法O(n+t)(2)稀疏矩阵的加法运算(方法一)(M1.m*M1.n+1)*(M1.t+M2.t)(3)稀疏矩阵的加法运算(方法二)(M1.t+M2.t)(4)稀疏矩阵的减法运算(M1.m*M1.n+1)*(M1.t+M2.t)(5)稀疏矩阵的数乘运算O(t)(6)稀疏矩阵的乘法运算M1.m*M2.n*M1.t*M2.t3.每个模块设计和调试时存在问题的思考前两个模块,即稀疏矩阵的加法和减法运算比较简单,但也因思路不够清晰而出现过错误,后来经过研究,例子分析,最后得出此算法。实现乘法运算是相对困难的,也是本次综合训练的难点,本组同学花了半天的时间思索,才想到了思路,经过几十次的调试分析,最后才能完成。虽然时间复杂度有点大,但我们付出了自己的汗水和心血。4.算法的改进设想我们组第一次做加法运算程序的时候,二重循环是对稀疏矩阵的行数和列数而言的。所以,当稀疏矩阵的阶数很大时,这个算法的时间复杂度特别高。经过我们小组的反复讨论和分析后,对加法运算程序进行了改进,这个新的算法的循环是对稀疏矩阵的非零元素个数而言的。当稀疏矩阵的阶数很大时,其非零元素个数相对而言要小得多,所以这个算法的时间复杂度相对而言很小。改进思想:利用“稀疏”特点进行存储和计算可以大大节省存储空间,提高计算效率。六、心得体会和参考资料我们小组的稀疏矩阵运算器的设计和实现主要依赖于三元组线性表的顺序存储结构。在本次综合训练的过程中,使我们更加了解了数据的存储结构和程序调试的技巧,而且小组成员之间团结协作,互相帮助,每个人都有很大的收获。数据结构这门课最主要的内容在于算法思想,而程序编写次之。在编写程序时,如果算法思想是正确的,那么这个程序就已经成功了一多半。算法思想在数据结构中占有重要地位,所以,要想学好数据结构这门课程,平时不只要加强程序的编写,更要多思考算法思想,加强对算法思想的锻炼和理解。参考资料:C++数据结构与程序设计---RobertL.Kruse(美)AlexanderJ.Ryba(美)著数据结构实用教程(第二版)徐孝凯编著C++程序设计(第二版)谭浩强编著七、小组成员分工程序编写:每个成员都进行了讨论和分析,都参与了程序的编写实验报告:PPT制作:矩阵及基本运算(杜丽英)

教学目标与要求使学生理解矩阵的概念。熟练掌握矩阵加法、数乘、乘法转置及可逆矩阵的定义及它们满足的运算算律。

教学重点与难点教学重点:矩阵的乘法运算;可逆矩阵定义。教学难点:矩阵的乘法。从变量线性变换的乘法引入矩阵乘法的定义。

教学方法与建议在引入矩阵的概念时,通过几个引例说明矩阵在生产实践和日常生活中有广泛的应用。在讲矩阵的基本运算时使学生看到,有些运算与数的运算类似,有些则不然。特别是矩阵乘法不满足交换律,消去律等。用学生熟悉的变量线性变换引入矩阵的乘法会使其定义更直观,便于学生理解,对于矩阵乘法不满足交换律、消去律除举例说明外,还需进一步说明有些幂指算律不成立,有零因子等。

教学过程设计1.矩阵概念的引入引例1:线性方程组的解取决于系数和常数项,线性方程组的系数和常数按原位置可排为一个数表引例2:某航空公司在A,B,C,D四个城市之间开辟了若干条航线,如图所示表示了四个城市间的航班图,如果从A到B有航班,则用带箭头的线连接AB,从A指向B。某航空公司在A,B,C,D四城市之间开辟了若干航线,如图所示表示了四城市间的航班图,如果从A到B有ABCDA0110B1010C1001D0100四个城市间的航班图情况也可用表格来表示,其中1表示有航班,0表示没有航班。某航空公司在A,B,C,D四城市之间开辟了若干航线,如图所示表示了四城市间的航班图,引例3:甲、乙两人玩石头、剪子、布游戏,下面的表格反映甲的赢得情况,其中甲胜得1;甲输得–1;两人相同为0。乙乙石头剪子布石头01-1剪子-101布1-10甲

甲2.矩阵的定义(1)定义1:由个数排成行列的数表用小括号或中括号将其括起来,称为矩阵,并用一个大写字母表示,即,简记为.①称为的行列元素④称为方阵②称为实矩阵⑤称为行矩阵或行向量③称为复矩阵⑥称为列矩阵或列向量(2)几个特殊矩阵零矩阵:所有元素都是0的矩阵.即单位矩阵;数量矩阵对角矩阵上三角形矩阵;下三角形矩阵例1:设变量可由变量表示为称之为由变量到变量的线性变换,它与矩阵是一一对应的.3.矩阵的基本运算定义同型矩阵:指两个矩阵对应的行数相等、对应的列数相等的矩阵.矩阵相等:设,,若,称.(1)线性运算:,加法:数乘:负矩阵:减法:算律:设为同阶矩阵,为常数,则有①⑤②⑥③⑦④⑧例2设,满足,求.解(2)矩阵乘法:引入:设有两个线性变换(Ⅰ)(Ⅱ)若想求出从到的线性变换,需将(Ⅱ)代入(Ⅰ),整理得(Ⅲ)分别比较(Ⅰ)、(Ⅱ)、(Ⅲ)式的矩阵,,线性变换(Ⅲ)称为线性变换(Ⅰ)与(Ⅱ)的乘积,相应的矩阵C称为矩阵A与B的乘积,即C=AB,或=定义:设,其中元素[注]的列数=的行数。的行数=的行数;的列数=的列数.与的先后次序不能改变.设,则例4,,[注]无意义.例5,,[注];,,但是.算律:①结合律:②分配律:③④,应用:设,,,线性方程组的矩阵形式线性变换的矩阵形式(3)方阵的幂:,为正整数,,算律:①②[注]一般例6,求.解:可以利用数学归纳法证得:(4)逆矩阵定义:对于,若有满足,则称为可逆矩阵,并把称为的逆矩阵。(或性质:①若为可逆矩阵,则的逆矩阵唯一.并且记的逆为②.③,则.④与都可逆,则可逆,且.一般有规定:可逆,定义,,则有,(,为整数)例7验证:与互为逆矩阵解:由于那么与互为逆矩阵。例8求解方程组,其中解:由例7知,于是即方程组的解为例9设方阵与满足,试证可逆。证:由,有,即或于是则可逆,且例10证明当时,可逆,并且证:因,令那么,同理,因此可逆,并且应用:(1)阶线性方程组求解。设,若可逆,则(2)求线性变换的逆变换。设,若可逆,(3)矩阵方程求解。设可逆,可逆,且已知,则实验1矩阵运算一实验目的熟悉MATLAB软件中关于矩阵初等变换的方法以及矩阵运算的各种命令。二实验内容与要求1.启动与退出双击MATLAB图标,进入MATLAB命令窗口,即可输入命令,开始运算。单击File菜单中的Exit,或使用MATLAB命令退出。数的输入>>a=5回车:a=5输入复数2—5i:b=2.0000-5.0000i问题1.1:输入“>>a=5;”,回车后与上面有什么区别?在行尾加“;”,该行结果不显示;在行尾加“,”或加“,”或不加标点,该行结果显示。注意,在MATLAB中,标点符号一定要在英文状态下输入!数组的输入>>b=[1,3,5,7,9,11]>>c=1:2:11>>d=linspace(1,11,6)问题1.2:体会以上输入放有什么区别和联系。若b为在0~2pi之间均匀分布的22个数据c=(1.3,2.5,7.6,2,-3),d=(23,20,17,14,11,8,5,2),各用何种方法输入比较简单?(3)矩阵的输入>>A=[2,3,5;1,3,5;6,9,4]%行之间要用分号隔开A=235135694等待键盘输入命令格式为:>>m=input(‘请输入初始量,m=’);请输入初始量,m=问题1.3:输入A(2,3),结果如何?输入A(7)又如何?体会以上输入的结果,注意,数和数组可作为矩阵的特。注意:变量名开头必须是英文字母,后面的字符可以是英文,数字和下划线,但不包含空格和标点;6.5版变量名最长可包含63个字符,以前的版本最多为31个字符;变量名,函数名对字母大小写是区分的。3.矩阵的大小的测试和定位>>A=[3,5,6;2,5,8;3,5,9;3,7,9];>>d=numel(A)%测试定矩阵A的元素,5.x版本没有此命令>>[n,m]=size(A)%测试A的行(n),列(m)数结果为:d=12n=4m=3>>[I,j]=find(A>3);%找出A中大于3的元素的行数注意:“%”后面是注释句,被忽略而不执行;对一个数组可用n=length(A),A若是矩阵,ng3出A的行,列数的最大值。4.矩阵的块的操作>>A=(2,:);%取出A的第2行的所有元素>>A=([1,3],:);%取出A的第1,3行的所有元素>>A=(2:3,1:2)%取出A的2,3行与1,2列交叉的元素ans=55>>A([1,3],:)=A([3,1],:);%将A的1行和3行互换问题1.4:如何将A的2,3列互换?>>A=(2,:)=4;%将A的第2行的所有元素用4取代>>A(find(A==3))=-3;%将A中等于3的所有的元素换为-3>>A=(2,:)=[]%删除A的第2行ans=565979>>reshape(A,2,6)%返回以A的元素重新构造的26维矩阵自找23个例子,熟悉数和数组的各种运算,以及它们的各种函数值。自找23个例子,熟悉矩阵的加减乘除及其他运算,注意和点运算的区别。输入一个矩阵A,取出A的第2行第1列的元素;取出A的第1,3,4列的所有元素;让A的第1列和第3列互换;删除A的第2列。产生3×4维的1矩阵,产生4×2维的随机矩阵,产生4维的单位矩阵。将A的第2行元素扩大2倍,再增加3后作为A的第3行元素。输入任意矩阵A,B(它们的元素个数相等),命令A(:)和A(:)=B会产生什么结果?A=[1,3,5;5,8,3;6,1,6],B=[3,6;9,3;4,7],C=[3,7,9,4,0,7],D=2:6,体会命令[A,B],[A,C],[A,B,D]所产生的结果,学习由小矩阵生成大矩阵的方法。四.提高内容1.多维数组的创建格式:A=cat(n,A1,A2,…,Am).说明:n=1和n=2时分别构造的[A1:A2]和[A1:A2],都是二维数组,而n=3时都可以构造出三维数组。【例1.2】>>A1=[1,2,3;4,5,6;7,8,9];A2=A1';A3=A2-A1;>>A4=cat(3,A1,A2,A3)或用另一种原始方式定义A4(:,:,1)=123456789A4(:,:,2)=147258369A4(:,:,3)=024-202-4-202.张量积格式:C=kron(A,B)%A为m×n矩阵,B为p×q矩阵,则C为mp×nq矩阵。说明:A与B的张量积定义为C=AB=其中,AB与BA均为mp×nq矩阵,但一般AB≠BA。【例1.3】A=,B=,求AB。>>A=[12;34];B=[123;456;789];>>C=kron(A,B)C=1232464568101278914161836948121215181620242124272832363.矩阵的范数格式:n=norm(A)%求矩阵A的普范数,等于A的最大奇异值。n=norm(A,1)%求A的列范数(1—范数),等于A的最大列之和。n=norm(A,2)%求A的2—范数,和norm(A)相同。n=norm(A,inf)%求行范数(无穷大范数),等于A的最大数之和。n=norm(A,’for’)%求矩阵A的Frobenius范数,‖A‖F=4.LU分解矩阵的三角分解又称LU分解,它的目的是将一个矩阵分解成一个下三角矩阵L和一个上三角矩阵U的乘积,将A=LU。格式:[L,U]=lu(X)%U为上三角阵,L为下三角阵或其变换形式,满足LU=X,[L,U,P]=lu(X)%U为上三角阵,L为下三角阵,P为单位矩阵的行边换满足LU=PX。【例1.4】>>A=[123;456;789];>>[L,U]=lu(A)L=0.14291.000000.57140.50001.00001.000000U=7.00008.00009.000000.85711.7143000.0000>>[L,U,P]=lu(A)L=1.0000000.14291.000000.57140.50001.0000U=7.00008.00009.000000.85711.7143000.0000P=0011000105.QR分解将矩阵A分解成一个正交矩阵与一个上三角矩阵的乘积。格式:[Q,R]=qr(A)%求得正交矩阵Q和上三角阵R,Q和R满足A=QR。[Q,R,E]=qr(A)%求得正交矩阵Q和上三角阵R,E为单位矩阵的变换形式,R的对角线元素按大小降序排列,满足AE=QR。例1.5>>A=[1,2,3;4,5,6;7,8,9;10,11,12];>>[Q,R]=qr(A)Q=-0.0776-0.83310.5456-0.0478-0.3105-0.4512-0.69190.4704-0.5433-0.0694-0.2531-0.7975-0.77620.31240.39940.3748R=-12.8841-14.5916-16.29920-1.0413-2.0826000ans=323355576899>>A(4,5)=3;%扩大A的维数,A成为4╳5矩阵,未定义元素为0>>[A(1:3、2:3),A(2:4、1:2);A,A(:、2)]%由小矩阵构造大矩阵,注意行列维数的搭配ans=2343366553251232436365352505>>diag(A、k);%抽取矩阵A的第k条对角线元素向量>>tril(A、k);%抽取矩阵A的第k条对角线下面的部分>>triu(A、k);%抽取矩阵A的第k条对角线上面的部分注意:“:”表示“全部”.5.矩阵的翻转操作>>flipud(A);%A进行上下翻转>>fliplr(A);%A进行左右翻转>>rot90(A);%A逆时针旋转90o问题1.5:rot90(A,2)和rot90(A,-2)结果有区别吗?6.特殊矩阵的产生>>A=eye(n);%产生n维单位矩阵>>A=ones(n、m);%产生n╳m维1矩阵>>A=zeros(n、m);%产生n╳m维0矩阵>>A=rand(n、m);%产生n╳m维随机矩阵(元素在9∽1之间)问题1.6:产生一个在区间[10,20]内均匀分布的4阶随机矩阵.>>randn(m、n);%产生m╳n正态分布随机矩阵>>randperm(n);%产生1∽n之间整数的随机排列【例1.1】>>randperm(6)ans=321546>>logspace(a、b、n);%在(10a、10b)之间产生n个对数等分量>>diag(a、b、n);%产生以a、b、c、d、…为对角线元素的矩阵>>hilb(n);%返回n阶hilbert矩阵,其元素为H(i、j)=1/(i+j-1)>>magic(n);%产生n阶魔方矩阵7.数的运算>>4+2;>>4*2;>>4/2;%右除2,等于2>>4/2;%4左除2,等于0.5>>4^3;%4的3次方>>sqrt(4);%4的算术平方根>>exp(3);%e的3次方,不能输成e^3>>log(4);%4的自然对数,log10(4)是以10为底,log2(4)是以2为底8.矩阵的运算>>A,;%A的转置>>det(A);%A的行列式,A必须是方阵>>reank(A);%A的秩>>inv(A);%A的逆>>eig(A);%A的本征值>>[X,D]=eig(A);%A的本征矢量X及本征值D>>trace(A);%A的迹,等于A的对角线元素之和>>3*A;%常数与矩阵相乘>>A+B;%A,B必须是同维矩阵,和3+A进行比较>>A-B;%A,B必须是同维矩阵,和3-A进行比较>>A*B;%和A.*B进行比较>>A/B;%(和A./B进行比较)>>A\B;%(和A.\B进行比较)>>A^2;%A^2相当于A*A(和A.^2进行比较)注意:矩阵的加减乘除按相关规则运算,否则给出警告信息;“.*”,“./”,“.\”,“.^”称为点运算(或称数组运算,又称元素群运算),点运算是前后矩阵对应元素之间的运算。问题1.7:求出A的本征矢量和本征值,比较2^4(A必须是方阵)和2.^A的区别.矩阵的其他运算和函数见表1.3.9.变量的存储与调用(1)存储>>savedataabc%将变量a,b,c存到data.mat文件中(2)调用>>loaddata%data.mat文件中所有变量加载到工作空间10.列出工作空间所有变量>>whos%列出工作空间所有变量的变量名、大小、字节数、数组维数11.联机求助>>helpsqrt%将显示出平方根sqrt命令的功能和使用方式五、练习和思考①熟悉MATLAB的启动和退出.表1。1基本的数学函数函数名含义函数名含义sin/cos正弦/余弦函数asin/acos反正弦/反余弦函数tan/cot正切/余切函数atan/acos反正切/反余切函数sec/csc正割/余割函数aec/acec反正割/反余割函数sinh/cosh双曲正弦/双曲余弦函数asinh/acosh反双曲正弦/反双曲余弦函数tanh/coth双曲正切/双曲余切函数atanh/acosh反双曲正切/反双曲余函数sech/csch双曲正割/双曲余割函数asech/acsch反双曲正割/反双曲余割函数exp指数函数sqrt平方根函数log对数函数log10常用对数函数abs绝对值函数angle角相位函数imag复数虚部函数real复数实部函数conj共轭复数函数sign正负符号函数fix朝零方向取整ceil朝正无穷方向取整round四舍五入取整floor朝无穷方向取整rem求余函数mod求余函数(带符号)gcd最大公约数lcm最小公倍数perms排列nchoosek组合表1.2特殊变量与函数函数名含义函数名含义ans默认返回变量eps默认相对浮点精度nargin函数输入变量个数nargout函数输出变量个数yarargin函数中输入的可选参数varargout函数中输出的可选参数i虚数单位pi圆周率inf无穷值nan不定值flnps浮点运算次数inputname输入参数名表1.3矩阵边换和矩阵函数函数名含义函数名含义flipud矩阵上下翻转fliplr矩阵左右翻转rot90矩阵旋转90°diag产生或提取对角阵tril产生或提取下三角阵triu产生或提取上三角阵eye产生单位矩阵rand产生随机矩阵ones产生1矩阵zeros产生零矩阵linespace构造线性分布向量logspace构造对数分布向量det行列式的值eig矩阵的特征值trice矩阵的迹inv矩阵的逆rref化行最简形null零空间实验十三MATLAB在复变函数中的应用一、实验目的:了解Matlab中有关复数的功能,能利用Matlab软件计算复变函数中的相关问题。二、相关知识我们知道,复数由实部和虚部组成,表示为:,和为实数,为虚单位。在Matlab中也采用这样的方法来表示虚数,只是有时也用来表示虚单位。我们可以在命令窗口直接输入一个复数z=2+3*I,也可以用complex()命令来生成复数。用该命令还可生成复向量、复矩阵。例如:a=(1:4);b=(5:8);z2=complex(a,b),则得到如下的结果:1.0000+5.0000i2.0000+6.0000i3.0000+7.0000i4.0000+8.0000i现在我们来看一下有关复数的几个命令:命令real(X)imag(X)angle(X)abs(X)conj(X)功能返回实部返回虚部返回辐角返回模返回共轭这些命令中的X均可以是复数、复向量、复矩阵。我们前面讨论的四则运算、解代数方程、求极限、求导数、求积分、级数展开等运算,都可以运用到复数上来。现在我们来看一下关于留数的计算。留数是复变函数中的一个重要概念,按照复变函数教材上的定义,函数在点的留数定义为:其中在区域内解析,是的孤立奇点,为圆周,。按照在的罗朗展开式,可以得到,即在的留数等于在的罗朗级数展开式中的系数。按照定义,我们固然可以通过求函数的罗朗级数的方法来求处函数在给定点的留数,但是如果遇到较为复杂的函数,要求留数并非一件易事,而Matlab为我们提供了一些计算工具。首先,对于分子分母均为多项式的函数,Matlab有一个专门用于计算留数的函数residue(),其格式如下:[R,P,K]=residue(B,A)其中:参数B是由复变函数的分子的系数组成的向量,参数A是由复变函数的分母的系数组成的向量,例如,对于函数,则,,参数是返回的留数,是由不同奇点的留数组成的向量。参数是返回的极点,也是一个向量,参数是个向量,由B/A的商的多项式系数组成,如果length(B)<length(A),则K为空向量,否则,length(K)=length(B)-length(A)+1。另外,函数residue()还可以根据已知的奇点P,奇点的留数R和K来计算分式复变函数的系数B和A,其格式如下:[B,A]=residue(R,P,K)其中参数的意义同前。例1:计算复变函数的留数,然后根据计算的结果反求复变函数的分式表达式的系数A和B。程序如下:clearB=[1,0];A=[1,0,0,0,-1];[R,P,K]=residue(B,A)[B1,A1]=residue(R,P,K)结果为:R=0.25000.2500-0.2500+0.0000i-0.2500-0.0000iP=-1.00001.00000.0000+1.0000i0.0000-1.0000iK=[]B1=00.00001.00000.0000A1=1.0000-0.0000-0.00000.0000-1.0000例2:计算复变函数的留数,然后根据计算的结果反求复变函数的分式表达式的系数A和B。程序只要修改例1中的B,A为B=[1,3,0,2],A=[1,6,-1]即可,结果如下:R=18.67060.3294P=-6.16230.1623K=1-3B1=1.00003.0000-0.00002.0000A1=1.00006.0000-1.0000当复变函数的分子分母不是多项式时,函数residue()就失效了,此时,我们主要根据4个留数计算规则和一个定理来进行留数的计算,这4个规则如下:(1)如果为的一级极点,则;(2)如果为的级极点,则;(3)设,且和在点都解析,如果,,,那么为的一级极点,则在的留数为:;(4)在无穷远点的留数:定理是:如果在扩充复平面内只有有限个孤立奇点,那么在所有奇点的留数的总和必定为零。例3:计算函数在点的留数。很明显,和都是的一级极点,所以使用第一个运算法则较为合适。用以下程序可以算得结果:clearsymszf=z*exp(z)/(z^2-1);z1=1;z2=-1;R1=limit((z-1)*f,z,1)R2=limit((z+1)*f,z,-1)结果为:R1=1/2*exp(1)R2=1/2*exp(-1)例4:计算函数在处的留数。我们可以看出在扩充的复平面上有三个极点:,,,根据计算留数的定理,在处的留数应该等于其在和处留数的和,和又是的一级奇点,所以有:,因此用以下的程序可以求解:clearsymszf=exp(z)/(z^2-1);R1=limit(f*(z-1),z,1)R2=limit(f*(z+1),z,-1)R=R1+R2结果如下:R1=1/2*exp(1)R2=-1/2*exp(-1)R=1/2*exp(1)-1/2*exp(-1)三、实验内容1.解方程组:;2.计算函数在点处的一阶导数;3.计算下列表达式在其奇点的留数:(1);(2);(3);(4);4.把作为符号,用函数Taylor将表达式进行泰勒展开;5.完成实验报告。数据结构课程设计报告设计题目:稀疏矩阵运算器年级班级姓名学号指导教师起止时间学期一、实验目的通过实习,了解并初步掌握设计、实现较大系统的完整过程,包括系统分析、编码设计、系统集成、以及调试分析,熟练掌握数据结构的选择、设计、实现以及操作方法,为进一步的应用开发打好基础。二、问题描述(具体任务)设计、实现两个稀疏矩阵在十字链表表示方法下的相加、相减、相乘。稀疏矩阵是指那些多数元素为零的矩阵。利用稀疏特点进行储存和计算可以大大节省储存空间,提高计算效率。实现一个能进行称稀疏矩阵基本运算的运算器。三、需求分析该程序所做的工作的是稀疏矩阵运算器,实现两个稀疏矩阵的基本运算。此程序规定:1、按照压缩存储的概念,只存储稀疏矩阵的非零元,以两个三元组{i,j,e}来表示矩阵的非零元的行,列和数值,就确定了一个非零元.由此,稀疏矩阵可由表示非零元的三元数组及行列数确定2、用户输入数据作为三元组的行,列和非零元的个数,用空格隔开.并输入非零元的行,列和数值3、本程序只对两个矩阵进行四则运算,所的结果矩阵应该另生成,用十字链表存放,并放入新的矩阵中,只要对矩阵求解就能求出答案.四、算法设计思想及流程图用十字链表存储方式实现稀疏矩阵的基本运算,此程序用到以下函数:voidCreateSMatrix(CrossList&R)//创建储存稀疏矩阵voidPrintSMatrix(CrossListR)//输出十字链表的函数voidMultSMatrix(CrossListM,CrossListN,CrossList&Q)//实现矩阵乘法intAddMatrix(CrossListM,CrossListN,CrossList&Q)//实现矩阵加法intSubtSMatrix(CrossListM,CrossListN,CrossList&Q)//实现矩阵减法voidmain()//主函数调用以上函数来实现其功能:首先调用CreateSMatrix()创建矩阵M和N,并输入稀疏矩阵的行数,列数,非零元素个数,通过PrintSMatrix()输出矩阵M和N,根据提示选择相应的运算,当进行加或减运算时,如果两个矩阵的行和列不相等时,就无法得到结果,并出现提示错误信息,当进行乘法运算时,要求矩阵M的列数必须等于矩阵N的行数,否则无法进行乘法运算,为了进行多种运算通过主函数的Do----While循环来实现,退出循环条件是输入”+”、”-”、”*”以外的任意字符即可退出循环。五、C语言源代码#include<stdio.h>#include<stdlib.h>#defineOVERFLOW-1#defineOK1#defineNULL0//建立十字链表typedefstructOLNode{introw,col;//该非零元的行和列下标inte;structOLNode*right,*down;//该非零元所在行表和列表的后继链域}OLNode,*OLink;typedefstruct{OLink*rhead,*chead;//行和列链表头指针向量基址由CreateSMatrix分配intmu,nu,tu;//系数矩阵的行数,列数和非零元个数}CrossList;//创建储存稀疏矩阵voidCreateSMatrix(CrossList&R){intm,n,t,i,j,k,a;OLinkp,q;if(R.rhead){R.rhead=NULL;R.chead=NULL;R.mu=0;R.nu=0;R.tu=0;}printf("\n请输入稀疏矩阵的行数列数非零元个数:");scanf("%d%d%d",&m,&n,&t);R.mu=m;R.nu=n;R.tu=t;if(!(R.rhead=(OLink*)malloc((m+1)*sizeof(OLink))))exit(OVERFLOW);if(!(R.chead=(OLink*)malloc((n+1)*sizeof(OLink))))exit(OVERFLOW);for(i=1;i<=R.mu+1;i++){R.rhead[i]=NULL;}for(i=1;i<=R.nu+1;i++){R.chead[i]=NULL;}for(k=1;k<=R.tu;k++){printf("\n请输入第%d个非零元的行号列号非零元素值:",k);scanf("%d%d%d",&i,&j,&a);if(!(p=(OLNode*)malloc(sizeof(OLNode))))exit(OVERFLOW);p->row=i;p->col=j;p->e=a;if(R.rhead[i]==NULL||R.rhead[i]->col>j){p->right=R.rhead[i];R.rhead[i]=p;}else{for(q=R.rhead[i];(q->right)&&q->right->col<j;q=q->right);p->right=q->right;q->right=p;}if(R.chead[j]==NULL||R.chead[j]->row>i){p->down=R.chead[j];R.chead[j]=p;}else{for(q=R.chead[j];(q->down)&&q->down->row<i;q=q->down);p->down=q->down;q->down=p;}}}//输出十字链表的函数voidPrintSMatrix(CrossListR){inti,j;intb=0;OLinkp;for(i=1;i<=R.mu;i++){p=R.rhead[i];printf("\t\t\t\t|");for(j=1;j<=R.nu;j++){if(p!=NULL){if(j==p->col){printf("%4d",p->e);p=p->right;}elseprintf("%4d",b);}elseprintf("%4d",b);}printf("|\n");}}//实现矩阵乘法voidMultSMatrix(CrossListM,CrossListN,CrossList&Q){inti,j,temp=0;OLinkq,pm,pn,pq;Q.mu=M.mu;Q.nu=N.nu;Q.tu=0;if(M.nu!=N.mu){printf("这两个矩阵不能相乘!");exit(OVERFLOW);}//矩阵相乘条件,矩阵1的行数必须等于矩阵2的列数if(M.tu*N.tu!=0){for(i=1;i<=M.mu;i++){for(j=1;j<=N.nu;j++){temp=0;pm=M.rhead[i];pn=N.chead[j];while(pm){while(pn&&pm&&(pm->col>pn->row)){if(pn->down!=NULL)pn=pn->down;elsepn=NULL;}if((pm&&pn&&pm->col==pn->row)){temp+=(pm->e)*(pn->e);if(pm->right!=NULL)pm=pm->right;elsepm=NULL;if(pn->down!=NULL)pn=pn->down;elsepn=NULL;}else{if(pm->right!=NULL)pm=pm->right;elsepm=NULL;}}//while(pm)if(temp){if(!(pq=(OLNode*)malloc(sizeof(OLNode))))exit(OVERFLOW);pq->row=i;pq->col=j;pq->e=temp;if(Q.rhead[i]==NULL||Q.rhead[i]->col>j){pq->right=Q.rhead[i];Q.rhead[i]=pq;}else{for(q=Q.rhead[i];(q->right)&&q->col<j;q=q->right);pq->right=q->right;q->right=pq;}if(Q.chead[j]==NULL||Q.chead[j]->row>i){pq->down=Q.chead[j];Q.chead[j]=pq;}else{for(q=Q.chead[j];(q->down)&&q->row<i;q=q->down);pq->down=q->down;q->down=pq;}(Q.tu)++;}//iftemp}//forj}//fori}//forif}//MultSMatrix()//实现矩阵加法intAddMatrix(CrossListM,CrossListN,CrossList&Q){/*初始条件:稀疏矩阵M与N的行数和列数对应相等。*//*操作结果:求稀疏矩阵的差Q=M+N*/inti,k;OLinkp,pq,pm,pn;OLink*col;if(M.mu!=N.mu||M.nu!=N.nu){printf("两个矩阵不是同类型的,不能相加\n");exit(OVERFLOW);}Q.mu=M.mu;/*初始化Q矩阵*/Q.nu=M.nu;Q.tu=0;/*元素个数的初值*/Q.rhead=(OLink*)malloc((Q.mu+1)*sizeof(OLink));if(!Q.rhead)exit(OVERFLOW);Q.chead=(OLink*)malloc((Q.nu+1)*sizeof(OLink));if(!Q.chead)exit(OVERFLOW);for(k=1;k<=Q.mu;k++)/*初始化Q的行头指针向量;各行链表为空链表*/Q.rhead[k]=NULL;for(k=1;k<=Q.nu;k++)/*初始化Q的列头指针向量;各列链表为空链表*/Q.chead[k]=NULL;col=(OLink*)malloc((Q.nu+1)*sizeof(OLink));/*生成指向列的最后结点的数组*/if(!col)exit(OVERFLOW);for(k=1;k<=Q.nu;k++)/*赋初值*/col[k]=NULL;for(i=1;i<=M.mu;i++)/*按行的顺序相加*/{pm=M.rhead[i];/*pm指向矩阵M的第i行的第1个结点*/pn=N.rhead[i];/*pn指向矩阵N的第i行的第1个结点*/while(pm&&pn)/*pm和pn均不空*/{if(pm->col<pn->col)/*矩阵M当前结点的列小于矩阵N当前结点的列*/{p=(OLink)malloc(sizeof(OLNode));/*生成矩阵Q的结点*/if(!p)exit(OVERFLOW);Q.tu++;/*非零元素数加1*/p->row=i;p->col=pm->col;p->e=+pm->e;p->right=NULL;pm=pm->right;/*pm指针向右移*/}elseif(pm->col>pn->col)/*矩阵M当前结点的列大于矩阵N当前结点的列*/{p=(OLink)malloc(sizeof(OLNode));/*生成矩阵Q的结点*/if(!p)exit(OVERFLOW);Q.tu++;/*非零元素数加1*/p->row=i;p->col=pn->col;p->e=+pn->e;p->right=NULL;pn=pn->right;/*pn指针向右移*/}elseif(pm->e+pn->e){p=(OLink)malloc(sizeof(OLNode));if(!p)exit(OVERFLOW);Q.tu++;p->row=i;p->col=pn->col;p->e=pm->e+pn->e;p->right=NULL;pm=pm->right;pn=pn->right;}else/*矩阵M、N当前结点的列相等且两元素之差为0*/{pm=pm->right;/*pm指针向右移*/pn=pn->right;/*pn指针向右移*/continue;}if(Q.rhead[i]==NULL)/*p为该行的第1个结点*/Q.rhead[i]=pq=p;/*p插在该行的表头且pq指向p(该行的最后一个结点)*/else/*插在pq所指结点之后*/{pq->right=p;/*完成行插入*/pq=pq->right;/*pq指向该行的最后一个结点*/}if(Q.chead[p->col]==NULL)/*p为该列的第1个结点*/Q.chead[p->col]=col[p->col]=p;/*p插在该列的表头且col[p->j]指向p*/else/*插在col[p->]所指结点之后*/{col[p->col]->down=p;/*完成列插入*/col[p->col]=col[p->col]->down;/*col[p->j]指向该列的最后一个结点*/}}while(pm)/*将矩阵M该行的剩余元素插入矩阵Q*/{p=(OLink)malloc(sizeof(OLNode));/*生成矩阵Q的结点*/if(!p)exit(OVERFLOW);Q.tu++;/*非零元素数加1*/p->row=i;/*给结点赋值*/p->col=pm->col;p->e=pm->e;p->right=NULL;pm=pm->right;/*pm指针向右移*/if(Q.rhead[i]==NULL)/*p为该行的第1个结点*/Q.rhead[i]=pq=p;/*p插在该行的表头且pq指向p(该行的最后一个结点)*/else/*插在pq所指结点之后*/{pq->right=p;/*完成行插入*/pq=pq->right;/*pq指向该行的最后一个结点*/}if(Q.chead[p->col]==NULL)/*p为该列的第1个结点*/Q.chead[p->col]=col[p->col]=p;/*p插在该列的表头且col[p->j]指向p*/else/*插在col[p->j]所指结点之后*/{col[p->col]->down=p;/*完成列插入*/col[p->col]=col[p->col]->down;/*col[p->j]指向该列的最后一个结点*/}}while(pn)/*将矩阵N该行的剩余元素插入矩阵Q*/{p=(OLink)malloc(sizeof(OLNode));/*生成矩阵Q的结点*/if(!p)exit(OVERFLOW);Q.tu++;/*非零元素数加1*/p->row=i;/*给结点赋值*/p->col=pn->col;p->e=+pn->e;p->right=NULL;pn=pn->right;/*pm指针向右移*/if(Q.rhead[i]==NULL)/*p为该行的第1个结点*/Q.rhead[i]=pq=p;/*p插在该行的表头且pq指向p(该行的最后一个结点)*/else/*插在pq所指结点之后*/{pq->right=p;/*完成行插入*/pq=pq->right;/*pq指向该行的最后一个结点*/}if(Q.chead[p->col]==NULL)/*p为该列的第1个结点*/Q.chead[p->col]=col[p->col]=p;/*p插在该列的表头且col[p->j]指向p*/else/*插在col[p->j]所指结点之后*/{col[p->col]->down=p;/*完成列插入*/col[p->col]=col[p->col]->down;/*col[p->j]指向该列的最后一个结点*/}}}for(k=1;k<=Q.nu;k++)if(col[k])/*k列有结点*/col[k]->down=NULL;/*令该列最后一个结点的down指针为空*/free(col);returnOK;}//实现矩阵减法intSubtSMatrix(CrossListM,CrossListN,CrossList&Q){/*初始条件:稀疏矩阵M与N的行数和列数对应相等。*//*操作结果:求稀疏矩阵的差Q=M-N*/inti,k;OLinkp,pq,pm,pn;OLink*col;if(M.mu!=N.mu||M.nu!=N.nu){printf("两个矩阵不是同类型的,不能相减\n");exit(OVERFLOW);}Q.mu=M.mu;/*初始化Q矩阵*/Q.nu=M.nu;Q.tu=0;/*元素个数的初值*/Q.rhead=(OLink*)malloc((Q.mu+1)*sizeof(OLink));if(!Q.rhead)exit(OVERFLOW);Q.chead=(OLink*)malloc((Q.nu+1)*sizeof(OLink));if(!Q.chead)exit(OVERFLOW);for(k=1;k<=Q.mu;k++)/*初始化Q的行头指针向量;各行链表为空链表*/Q.rhead[k]=NULL;for(k=1;k<=Q.nu;k++)/*初始化Q的列头指针向量;各列链表为空链表*/Q.chead[k]=NULL;col=(OLink*)malloc((Q.nu+1)*sizeof(OLink));/*生成指向列的最后结点的数组*/if(!col)exit(OVERFLOW);for(k=1;k<=Q.nu;k++)/*赋初值*/col[k]=NULL;for(i=1;i<=M.mu;i++)/*按行的顺序相减*/{pm=M.rhead[i];/*pm指向矩阵M的第i行的第1个结点*/pn=N.rhead[i];/*pn指向矩阵N的第i行的第1个结点*/while(pm&&pn)/*pm和pn均不空*/{if(pm->col<pn->col)/*矩阵M当前结点的列小于矩阵N当前结点的列*/{p=(OLink)malloc(sizeof(OLNode));/*生成矩阵Q的结点*/if(!p)exit(OVERFLOW);Q.tu++;/*非零元素数加1*/p->row=i;/*给结点赋值*/p->col=pm->col;p->e=pm->e;p->right=NULL;pm=pm->right;/*pm指针向右移*/}elseif(pm->col>pn->col)/*矩阵M当前结点的列大于矩阵N当前结点的列*/{p=(OLink)malloc(sizeof(OLNode));/*生成矩阵Q的结点*/if(!p)exit(OVERFLOW);Q.tu++;/*非零元素数加1*/p->row=i;/*给结点赋值*/p->col=pn->col;p->e=-pn->e;p->right=NULL;pn=pn->right;/*pn指针向右移*/}elseif(pm->e-pn->e)/*矩阵M、N当前结点的列相等且两元素之差不为0*/{p=(OLink)malloc(sizeof(OLNode));/*生成矩阵Q的结点*/if(!p)exit(OVERFLOW);Q.tu++;/*非零元素数加1*/p->row=i;/*给结点赋值*/p->col=pn->col;p->e=pm->e-pn->e;p->right=NULL;pm=pm->right;/*pm指针向右移*/pn=pn->right;/*pn指针向右移*/}else/*矩阵M、N当前结点的列相等且两元素之差为0*/{pm=pm->right;/*pm指针向右移*/pn=pn->right;/*pn指针向右移*/continue;}if(Q.rhead[i]==NULL)/*p为该行的第1个结点*/Q.rhead[i]=pq=p;/*p插在该行的表头且pq指向p(该行的最后一个结点)*/else/*插在pq所指结点之后*/{pq->right=p;/*完成行插入*/pq=pq->right;/*pq指向该行的最后一个结点*/}if(Q.chead[p->col]==NULL)/*p为该列的第1个结点*/Q.chead[p->col]=col[p->col]=p;/*p插在该列的表头且col[p->j]指向p*/else/*插在col[p->]所指结点之后*/{col[p->col]->down=p;/*完成列插入*/col[p->col]=col[p->col]->down;/*col[p->j]指向该列的最后一个结点*/}}while(pm)/*将矩阵M该行的剩余元素插入矩阵Q*/{p=(OLink)malloc(sizeof(OLNode));/*生成矩阵Q的结点*/if(!p)exit(OVERFLOW);Q.tu++;/*非零元素数加1*/p->row=i;/*给结点赋值*/p->col=pm->col;p->e=pm->e;p->right=NULL;pm=pm->right;/*pm指针向右移*/if(Q.rhead[i]==NULL)/*p为该行的第1个结点*/Q.rhead[i]=pq=p;/*p插在该行的表头且pq指向p(该行的最后一个结点)*/else/*插在pq所指结点之后*/{pq->right=p;/*完成行插入*/pq=pq->right;/*pq指向该行的最后一个结点*/}if(Q.chead[p->col]==NULL)/*p为该列的第1个结点*/Q.chead[p->col]=col[p->col]=p;/*p插在该列的表头且col[p->j]指向p*/else/*插在col[p->j]所指结点之后*/{col[p->col]->down=p;/*完成列插入*/col[p->col]=col[p->col]->down;/*col[p->j]指向该列的最后一个结点*/}}while(pn)/*将矩阵N该行的剩余元素插入矩阵Q*/{p=(OLink)malloc(sizeof(OLNode));/*生成矩阵Q的结点*/if(!p)exit(OVERFLOW);Q.tu++;/*非零元素数加1*/p->row=i;/*给结点赋值*/p->col=pn->col;p->e=-pn->e;p->right=NULL;pn=pn->right;/*pm指针向右移*/if(Q.rhead[i]==NULL)/*p为该行的第1个结点*/Q.rhead[i]=pq=p;/*p插在该行的表头且pq指向p(该行的最后一个结点)*/else/*插在pq所指结点之后*/{pq->right=p;/*完成行插入*/pq=pq->right;/*pq指向该行的最后一个结点*/}if(Q.chead[p->col]==NULL)/*p为该列的第1个结点*/Q.chead[p->col]=col[p->col]=p;/*p插在该列的表头且col[p->j]指向p*/else/*插在col[p->j]所指结点之后*/{col[p->col]->down=p;/*完成列插入*/col[p->col]=col[p->col]->down;/*col[p->j]指向该列的最后一个结点*/}}}for(k=1;k<=Q.nu;k++)if(col[k])/*k列有结点*/col[k]->down=NULL;/*令该列最后一个结点的down指针为空*/free(col);returnOK;}//主函数voidmain(){intm,i,n;charc;CrossListM,N,Q;printf("********创建稀疏矩阵M*********\n");CreateSMatrix(M);printf("\t***稀疏矩阵M的通常阵列形式为:\n");PrintSMatrix(M);printf("\n\t********创建稀疏矩阵N********\n\n");CreateSMatrix(N);printf("\t***稀疏矩阵N的通常阵列形式为:\n");PrintSMatrix(N);m=M.mu;n=N.nu;if(!(Q.rhead=(OLink*)malloc((m+1)*sizeof(OLink))))exit(OVERFLOW);if(!(Q.chead=(OLink*)malloc((n+1)*sizeof(OLink))))exit(OVERFLOW);for(i=1;i<=((M.mu>N.nu)?(M.mu+1):(N.nu+1));i++){Q.rhead[i]=NULL;Q.chead[i]=NULL;}Q.mu=M.mu;Q.nu=N.nu;Q.tu=0;do{printf("如做加法,请输入+,如做减法,请输入-,如做乘法,请输入*:\t");getchar();scanf("%c",&c);if(c=='+'){AddMatrix(M,N,Q);printf("\t***稀疏矩阵M+N的通常阵列形式为:\n");PrintSMatrix(Q);}elseif(c=='-'){SubtSMatrix(M,N,Q);printf("\t***稀疏矩阵M-N的通常阵列形式为:\n");PrintSMatrix(Q);}elseif(c=='*'){MultSMatrix(M,N,Q);printf("\t***稀疏矩阵M*N的通常阵列形式为:\n");PrintSMatrix(Q);}elsebreak;}while(1);}六、测试分析(运行结果)七、总结(收获及体会)通过此次的课程设计对十字链表存储的稀疏矩阵更深一步的理解和认识,一开始我们从参考书上找来了课题,但是毕竟是参考书,做到后来发现很多程序都是不完整的,这让我们伤透了脑筋。看着别的小组都弄得有模有样了,可是我们还没有一点头绪,好不容易又从网络和参考书找到了相关信息,可是结果还是很不尽人意。程序都弄好了,调试也没有问题,可是就是无法达到预期想要的结果。查阅的资料只是一个参考,最后还是要靠自己动脑筋,然后我们大家一起齐心协力,虽然内容并不是很复杂,但是我们觉得设计的过程相当重要,学到了很多,收获了很多。我觉得课程设计反映的是一个从理论到实际应用的过程,但是更远一点可以联系到以后毕业之后从学校转到踏上社会的一个过程。小组人员的配合﹑相处,以及自身的动脑和努力,都是以后工作中需要的。八、参考文献数据结构(C语言版)严蔚敏吴伟明编著清华大学出版社五、调试分析1、本程序中相乘部分较易,但是相加的部分则是让人伤脑筋,但最还仔细分析还是可以实现的。2、在用十字链表表示稀疏矩阵时,相加或相减所得的结果应该另生成,乘积矩阵也可用二维数组表示。3、通过数据的测试,能按要求实现功能。安徽理工大学数据结构课程设计说明书题目:稀疏矩阵的运算院系:计算机科学与工程学院专业班级:计算机10-*班学号:202130****学生姓名:******指导教师:2021年12月28日安徽理工大学课程设计(论文)任务书计算机科学与工程学院2021年11月8日安徽理工大学课程设计(论文)成绩评定表目录1问题描述............................................12需求分析............................................13总体设计............................................23.1Matrix结构的定义................................23.2系统流程图......................................34详细设计............................................44.1“菜单”界面....................................44.2建立矩阵........................................44.3显示矩阵..........................

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论