数据结构课程设计(矩阵的运算)
矩阵的加法运算问题-数据结构与算法课程设计报告
![矩阵的加法运算问题-数据结构与算法课程设计报告](https://img.taocdn.com/s3/m/862e48ed6294dd88d1d26b01.png)
合肥学院计算机科学与技术系课程设计报告2009 ~2010 学年第二学期课程数据结构与算法课程设计名称矩阵的加法运算问题学生姓名胡九铭学号0804012039专业班级计算机科学与技术08级(2)班指导教师王昆仑张贯虹2010 年6 月一、问题分析和任务定义1、问题分析此程序需要完成如下要求:设计十字链表表示稀疏矩阵,并实现矩阵的加法运算。
并且要求能够要检查有关运算的条件,并对错误的条件产生报警。
2、(1)设计函数建立稀疏矩阵。
(2)设计函数输出稀疏矩阵的值。
(3)构造函数进行两个稀疏矩阵相加,(4)构造函数进行两个稀疏矩阵相加时是否能够符合运算要求,即检查有关运算的条件,并对错误的条件产生错误警报。
(5)登录函数,即需要口令才可以登录并使用计算器(6)退出系统3、原始数据的输入和输出格式由于该问题是关于矩阵的运算方面的内容,所以输入时是对矩阵中的非零元分别进行插入矩阵中,输入格式是:行、列、元素值,以数字的形式输入。
输出时,为了能更易于用户的观察和比较所以选用矩阵表的格式输出,这可以更加方便看出结果的正确与否,也有利于在编写程序的时候修改和改善程序的源代码。
4、算法应能实现的功能该算法应能实现:正确的用十字链表的存储结构建立数个稀疏矩阵;正确的输出用户建立的矩阵;能进行数个矩阵的相加运算;能对加法运算的运算条件进行判断并能对其产生报警提示。
5、该问题测试用例(a)两个行列分别相同的矩阵0 0 0 9 0 05 0 0 + 5 2 00 0 9 0 0 0预测结果:9 0 0= 10 2 00 0 9(b)两个行列数不相同的矩阵3 0 0 0 0 0 00 0 6 06 0 0 + 0 0 0 02 0 0 00 0 0 0 0 0 0预测结果:输出:不能进行加法运算,矩阵的行数和列数应分别相同!!!(c)两个以上的矩阵相加0 0 0 0 0 1 0 0 0 00 6 0 0 0 0 -3 0 0 05 0 3 0 0 + 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 00 0 0 0 0 0 0 0 0 00 0 0 5 02 0 0 0 01 0 0 0 00 0 0 0 00 5 0 0 0预测结果:1 0 0 5 02 3 0 0 0= 6 0 3 0 00 0 0 0 00 5 0 0 0二、数据结构的选择和概要设计1、主界面设计:为了实现对稀疏矩阵的多种算法功能的管理,首先设计一个含有多个菜单项的主控菜单子程序以链接系统的各项子功能,方便用户交互式使用本系统。
数据结构课程设计报告---矩阵的运算
![数据结构课程设计报告---矩阵的运算](https://img.taocdn.com/s3/m/c7b6f89c02020740bf1e9b37.png)
数据结构课程设计报告题目:专业:班级:学号:姓名:指导老师:时间:一、课程设计题目及所涉及知识点设计题目是“矩阵的运算”;所涉及的知识点主要是:1、利用数组的形式来储存数据,在main函数里面,实现对于数据的输入操作,利用switch语句进行选择来执行操作,利用for语句与do……while语句来实现功能的循环操作。
2、矩阵的加法、减法、乘法、数乘、转置的基本算法方式。
3、通过switch语句进行选择来执行操作,来实现每个算法的功能。
二、课程设计思路及算法描述设计思路:用程序实现矩阵能够完成矩阵的转置运算;矩阵的数乘运算;矩阵的加法运算;矩阵的减法运算;矩阵的乘法运算;这几种矩阵的简单的运算。
用数组把将要运算的矩阵储存起来,然后实现矩阵的这几种运算。
在main函数里面,来实现对于数据的输入操作,利用switch语句进行选择来执行操作,利用for语句来实现功能的循环操作。
算法:算法1:矩阵的转置运算;首先是把将要运算的矩阵存放在数组中,矩阵的转置运算,就是把你将要进行运算的A矩阵的行ar和列ac,把A矩阵的行ar作为B矩阵的bc,A矩阵的列ac作为B矩阵的br,这样得到的新矩阵B的行br和列bc就是矩阵A的转置。
算法如下:for(i=0;i<ar;i++)for(j=0;j<ac;j++)B[j][i]=A[i][j];算法2:矩阵的数乘运算;首先是把将要运算的矩阵存放在数组中,矩阵的数乘运算,就是实现用一个实数k 去A矩阵。
实数k去乘矩阵的每一行和每一列,得到的一个新的矩阵B,这样就解决了矩阵的数乘运算。
算法如下:for(i=0;i<ar;i++)for(j=0;j<ac;j++)B[i][j]=k*A[i][j];算法3:矩阵的加法运算;首先是把将要运算的矩阵存放在数组中,矩阵的加法运算,就是要实现A矩阵与B 矩阵进行加法运算。
事实上就是A矩阵的每一行ar与B矩阵的每一行br进行加法运算,而得到的一个新的矩阵C的每一行cr就是A矩阵的ar行与B矩阵的br行的和;A矩阵的每一列ac与B矩阵的每一列bc进行加法运算,而得到的一个新的矩阵C的每一列cc 就是A矩阵的ac列与B矩阵的bc列的和。
c语言课程设计矩阵运算
![c语言课程设计矩阵运算](https://img.taocdn.com/s3/m/5b2767a918e8b8f67c1cfad6195f312b3169ebb5.png)
课程设计任务书一、课程设计题目:矩阵运算二、课程设计工作自2008年9月8日起至2008年9月12日止三、课程设计内容:运用所学的C语言知识,编制和调试程序,具有如下功能:(1)两个矩阵加、减、乘等运算(2)对某一矩阵增加一行或一列(3)对某一矩阵减少一行或一列(4)自己再增加一项或两项功能四、课程设计要求:程序质量:贯彻结构化程序设计思想。
用户界面友好,功能明确,操作方便;可以加以其它功能或修饰。
用户界面中的菜单至少应包括“输入数据”、“算术运算”、“增行”、“减行”、“退出”5项。
代码应适当缩进,并给出必要的注释,以增强程序的可读性。
课程设计说明书:课程结束后,上交课程设计说明书(打印稿和电子稿),其内容如下:封面课程设计任务书目录需求分析(分析题目的要求)程序流程图(总体流程图和主要功能模块流程图)核心技术的实现说明及相应程序段个人总结参考资料源程序及适当的注释指导教师:学生签名:成绩:教师评语:目录一、需求分析 (1)二、程序流程图 (2)三、核心技术的实现说明及相应程序段 (8)四、个人总结 (18)五、参考资料 (19)六、源程序 (19)一、需求分析经过对程序设计题目的分析可知,整个程序的设计实现大致分为六个模块,其中每一个模块对应一个函数,他们的功能分别是:加运算函数(jia),减运算函数(jian),乘运算函数(cheng),增行函数(jiahang),减列函数(jianlie)以及求最大值函数(fun)。
在这些函数当中,前五个函数的实现严格按照题目的要求,而最后一个函数为自行设计的函数。
1、增加运算函数主要实现将两矩阵相加的功能;2、减运算函数实现的功能是将两矩阵相减;3、乘运算函数主要实现将两矩阵相乘的功能;4、增行函数实现的是在所选的矩阵中增加一行的功能;5、减列函数实现的是在所选的矩阵中减掉一列的功能;6、求取最大值函数实现的功能是找到并输出所给矩阵最大值。
程序的一次运行当中可以循环执行所有的功能,并根据需要终止程序的执行。
数据结构矩阵相关操作的课程设计
![数据结构矩阵相关操作的课程设计](https://img.taocdn.com/s3/m/016d1a620066f5335b812107.png)
课程设计题目矩阵乘法教学院计算机学院专业09计算机科学与技术班级姓名指导教师年月日目录1 概述 (3)2 设计目的 (3)3 设计功能说明 (3)4 详细设计说明 (3)5 流程图 (4)6 调试及结果 (5)1程序调试 (5)2运行编译连接过程......................................................... 5-8 7 总结 (9)附录...........................................................................10-24 参考文献 (25)成绩评定表 (26)1 概述数据结构是一门理论性强、思维抽象、难度较大的课程,是基础课和专业课之间的桥梁只有进行实际操作,将理论应用于实际中,才能确实掌握书中的知识点。
通过课程设计,不仅可以加深学生对数据结构基本概念的了解,巩固学习成果,还能够提高实动手力。
为学生后继课程的学习打下良好的基础。
2 设计目的《数据结构》课程设计是在教学实践基础上进行的一次大型实验,也是对该课程所学理论知识的深化和提高。
因此,要求学生能综合应用所学知识,设计与制造出具有较复杂功能的应用系统,并且在实验的基本技能方面上进行一次全面的训练。
通过程序的编译掌握对程序的调试方法及思想,并且让学生学会使用一些编程技巧。
促使学生养成良好的编程习惯。
1.使学生能够较全面地巩固和应用课堂中所学的的基本理论和程序设计方法,能够较熟练地完成程序的设计和调试。
2.培养学生综合运用所学知识独立完成程序课题的能力。
3.培养学生勇于探索、严谨推理、实事求是、有错必改,用实践来检验理论,全方位考虑问题等科学技术人员应具有的素质。
4.提高学生对工作认真负责、一丝不苟,对同学团结友爱,协作攻关的素质。
5.培养学生从资料文献、科学实验中获得知识的能力,提高学生从别人经验中找到解决问题的新途径的悟性,初步培养工程意识和创新能力。
c语言课程设计矩阵运算
![c语言课程设计矩阵运算](https://img.taocdn.com/s3/m/ebf7be29e55c3b3567ec102de2bd960590c6d9aa.png)
c语言课程设计矩阵运算一、教学目标本节课的教学目标是使学生掌握C语言实现矩阵运算的基本方法,包括矩阵的创建、矩阵的加减法、矩阵的转置以及矩阵的乘法。
知识目标要求学生理解矩阵运算的数学原理,能够运用C语言实现矩阵的基本运算;技能目标要求学生熟练使用C语言进行矩阵运算的编程实践;情感态度价值观目标则是培养学生的逻辑思维能力,提高学生对计算机编程的兴趣。
二、教学内容本节课的教学内容主要包括矩阵运算的数学原理介绍、C语言实现矩阵运算的编程实践和代码调试。
教学大纲安排如下:1.引入矩阵的概念和矩阵运算的基本定义。
2.讲解矩阵的创建、矩阵的加减法、矩阵的转置以及矩阵的乘法的数学原理。
3.引导学生运用C语言实现矩阵的基本运算。
4.通过编程实践和代码调试,使学生熟练掌握C语言实现矩阵运算的方法。
三、教学方法本节课采用讲授法、讨论法和实验法相结合的教学方法。
首先,通过讲授法向学生讲解矩阵运算的数学原理和C语言实现方法;其次,通过讨论法引导学生相互交流和讨论,提高他们对矩阵运算的理解;最后,通过实验法让学生动手实践,调试代码,提高他们的编程能力。
四、教学资源本节课的教学资源主要包括教材、参考书、多媒体资料和实验设备。
教材和参考书用于为学生提供理论知识和编程技巧;多媒体资料用于辅助讲解和演示矩阵运算的原理和实现方法;实验设备则是学生进行编程实践和代码调试的必要工具。
五、教学评估本节课的教学评估主要包括平时表现、作业和考试三个部分。
平时表现主要评估学生在课堂上的参与程度、提问和回答问题的积极性等;作业则是对学生掌握矩阵运算能力的考察,要求学生独立完成并提交;考试则是对学生综合运用C语言实现矩阵运算能力的评估,包括理论知识和编程实践。
评估方式应客观、公正,能够全面反映学生的学习成果。
六、教学安排本节课的教学安排如下:总共安排4个课时,第1课时介绍矩阵运算的数学原理,第2课时讲解C语言实现矩阵运算的方法,第3课时进行编程实践和代码调试,第4课时进行教学评估。
c课程设计矩阵运算
![c课程设计矩阵运算](https://img.taocdn.com/s3/m/05e6035e03020740be1e650e52ea551811a6c972.png)
c 课程设计矩阵运算一、教学目标本节课的教学目标是让学生掌握矩阵的基本运算,包括矩阵的加法、减法、数乘以及矩阵的乘法。
通过学习,学生应能理解矩阵运算的定义和规则,并能运用这些运算解决实际问题。
此外,学生还应掌握矩阵运算的数学原理,提高逻辑思维和数学运算能力。
在情感态度价值观方面,学生应培养对数学学科的兴趣,增强自信心,培养团队合作精神。
二、教学内容本节课的教学内容主要包括矩阵的基本运算和数学原理。
首先,介绍矩阵的加法、减法、数乘和矩阵的乘法,通过举例说明这些运算的定义和规则。
然后,讲解矩阵运算的数学原理,包括线性方程组的解法、行列式的计算以及矩阵的逆矩阵。
最后,通过实际案例让学生运用矩阵运算解决实际问题,提高学生的应用能力。
三、教学方法为了激发学生的学习兴趣和主动性,本节课将采用多种教学方法。
首先,采用讲授法,清晰地讲解矩阵运算的定义和规则,以及数学原理。
其次,采用讨论法,让学生分组讨论矩阵运算的应用案例,培养学生的思考和表达能力。
此外,还采用案例分析法,让学生分析实际问题,运用矩阵运算解决问题。
最后,通过实验法,让学生动手实践,加深对矩阵运算的理解。
四、教学资源为了支持教学内容和教学方法的实施,本节课将准备以下教学资源。
首先,教材和相关参考书,为学生提供系统的学习资料。
其次,多媒体资料,如PPT、教学视频等,用于直观地展示矩阵运算的过程和应用案例。
此外,还将提供实验设备,如计算器、电脑等,让学生进行实际操作,提高实践能力。
通过丰富多样的教学资源,丰富学生的学习体验,提高学习效果。
五、教学评估本节课的教学评估将采用多元化的评估方式,以全面、客观地评价学生的学习成果。
评估方式包括平时表现、作业、考试等。
平时表现主要评估学生的课堂参与度、提问回答等,通过观察学生的表现来了解他们的学习状态。
作业方面,将布置适量的练习题,要求学生在规定时间内完成,通过批改作业了解学生对矩阵运算的理解和掌握程度。
考试方面,将设置期中考试和期末考试,考试内容涵盖本节课的全部知识点,通过考试来检验学生的学习成果。
矩阵运算的课程设计
![矩阵运算的课程设计](https://img.taocdn.com/s3/m/82a3b843c4da50e2524de518964bcf84b8d52d02.png)
矩阵运算的课程设计一、课程目标知识目标:1. 理解矩阵的定义,掌握矩阵的基本元素和结构特点;2. 学会矩阵的加、减、乘运算,并能够运用这些运算解决实际问题;3. 掌握矩阵的转置、逆矩阵的概念及其运算方法;4. 了解矩阵运算在现实生活中的应用,如线性方程组求解、图像处理等。
技能目标:1. 能够熟练运用矩阵运算公式进行计算,提高解题速度和准确性;2. 能够运用矩阵运算解决实际问题,培养分析问题和解决问题的能力;3. 能够运用矩阵软件(如MATLAB)进行矩阵运算,提高计算效率。
情感态度价值观目标:1. 培养学生对矩阵运算的兴趣,激发学习热情;2. 培养学生的团队协作精神,学会与他人共同探讨问题;3. 引导学生认识到矩阵运算在科学技术发展中的重要性,增强学生的国家使命感和社会责任感。
课程性质:本课程为高中数学选修课程,适用于对数学有一定基础的学生。
学生特点:学生具备一定的代数基础,对矩阵概念有一定了解,但对矩阵运算尚不熟悉。
教学要求:结合学生特点,注重启发式教学,通过实例分析、问题解决等方法,使学生掌握矩阵运算的基本技能,并培养其运用矩阵运算解决实际问题的能力。
在教学过程中,关注学生的情感态度价值观的培养,提高学生的学习兴趣和积极性。
最终实现课程目标的分解与达成。
二、教学内容1. 矩阵的定义与基本概念:回顾矩阵的定义,讨论矩阵的行、列、元素等基本属性。
教材章节:第二章第一节2. 矩阵的加、减运算:讲解矩阵加、减法的规则,通过例题演示运算方法。
教材章节:第二章第二节3. 矩阵的乘法运算:介绍矩阵乘法法则,分析矩阵乘法与实数乘法的异同。
教材章节:第二章第三节4. 矩阵的转置与逆矩阵:阐述转置矩阵的概念,探讨逆矩阵的定义及性质。
教材章节:第二章第四节5. 矩阵的应用:介绍矩阵在解决线性方程组、图像处理等方面的应用。
教材章节:第二章第五节6. 矩阵运算软件实践:指导学生使用MATLAB软件进行矩阵运算,提高计算效率。
数据结构课程设计(矩阵的运算)
![数据结构课程设计(矩阵的运算)](https://img.taocdn.com/s3/m/cdd5b1fe3169a4517623a365.png)
数据结构课程设计报告题目:_____________________________________专业:_____________________________________班级:_____________________________________学号:_____________________________________姓名:_____________________________________指导老师:__________________________________时间:_____________________________________、课程设计题目及所涉及知识点设计题目是“矩阵的运算” ,所涉及的知识点主要是:1、数据结构中的对于结构体的定义,用typedef struct 来实现,根据所设计的问题在结构体里面定义数据类型及其变量,用define 定义数组的大小,然后利用typedef 来实现对于变量的未知类型确定正确的类型。
2、利用数组的形式来储存数据,在实现不同操作过程中,有的用一维结构体数组(三元组顺序表)来存储,有的用二维数组来储存。
3、转置的过程中利用的是快速转置的方法,附设了num 和cpot 两个辅助变量。
4、矩阵的加法、减法、乘法、逆运算的基本算法方式。
5、通过调用每个函数,来实现每个算法的功能。
、课程设计思路及算法描述设计思路:1、首先是对于转置的考虑,要运用快速转置的方法实现,必须用三元组顺序表来储存数据,所以在第一个结构体中存在int 类型的行数(mu )列数(nu )以及非零元素的个数(tu );然后第二个结构体中分别有非零元素的行下标(i)、列下标(j)和元素数值(e),最后在第一个结构体中实现对第二个结构体成为数组结构体类型。
2、对于其余加法、减法、乘法和逆运算则是运用另一个结构体来实现,里面只有矩阵的行数、列数和一个二维数组(用float 来定义类型)。
C++课程设计_矩阵运算
![C++课程设计_矩阵运算](https://img.taocdn.com/s3/m/d8980caadd3383c4bb4cd2fa.png)
矩阵运算系统的研究与设计摘要矩阵运算系统是一个数据运算系统,程序主要包括矩阵的基本数据成员,矩阵运算成员函数,以及矩阵系统界面等,实现矩阵的运算和文件读入和输出操作等。
本系统用C++语言开发,包含了矩阵的最基本数据成员,其中有矩阵的维数和矩阵的个元素。
类中实现了判断矩阵维数相等,是否可以相乘,是否为空矩阵等判断功能函数。
以及矩阵加法、减法、乘法、转置、求矩阵行列式、矩阵余子式等运算功能。
除了基本的矩阵运算功能以外,还包含了对于文件的读写,实现了更方便的读入和输出的功能。
本系统可以先用来实现对于矩阵的各种运算,可实现在控制台和文件中的读入与输出,且可以在用户指定的位置就行输入输出操作。
实现了系统更方便的使用。
另外使用了system应用,更改了控制台背景颜色,使得系统更加美观。
关键词:矩阵运算,运算符重载,文件操作,修改控制台背景颜色。
目录1.题目内容及要求 (3)1.2功能要求: (3)1.2其他要求: (3)2.设计思路 (4)2.1文件的分配: (4)2.3类的实现: (4)2.4矩阵运算功能实现: (5)2.5扩展功能实现: (6)2.6主函数编写: (6)3.具体实现 (9)3.1程序开头包含所需要使用到的头文件: (9)3.2类的定义: (9)3.3menu_use函数 (10)3.4menu_i()函数 (10)3.5menu_0()函数 (10)3.6main函数 (10)4运行调试与分析讨论 (11)5.设计体会与小结 (13)5.1遇到的问题: (13)5.2自身所提高和学习到的能力: (13)6.参考文献 (14)1.题目内容及要求1.1基本要求:编写矩阵类--封装矩阵的运算(加、减、乘、转置、...);每个运算用一个方法实现1.2功能要求:1.用C++面向对象的思想编写矩阵类。
2.编写矩阵类实现矩阵的运算。
1.2其他要求:1. 源程序应当加注释。
以便于阅读。
2. 采用文本菜单界面。
大数据结构课程设计(稀疏矩阵运算器)
![大数据结构课程设计(稀疏矩阵运算器)](https://img.taocdn.com/s3/m/421b933803d8ce2f006623c8.png)
实习报告题目:编制一个稀疏矩阵运算器的程序班级:智能科学与技术系姓名:尤雅萍学号:31520082204064 完成日期:2009-11-27一•需求分析1.【问题描述】稀疏矩阵是指那些多数元素为零的矩阵。
利用“稀疏”特点进行存储和计算可以大大节省存储空间,提高计算效率。
实现一个能进行稀疏矩阵基本运算的运算器。
2.【基本要求】以“带行逻辑链接信息”的三元组顺序表示稀疏矩阵,实现两个矩阵相加,相减和相乘的运算,稀疏矩阵的输入形式采用三元组表示,而运算结果的矩阵则以通常的阵列形式列出。
3.【测试数据】(1)10 0 0 0 0 0 10 0 00 0 9 + 0 0 -1 = 0 0 8-1 0 0 1 0 -3 0 0 -3(2)10 0 0 0 10 00 9 - 0 -1 = 0 10-1 0 1 -3 -2 3(3)4 -3 0 0 1 3 0 0 0 -6 00 0 0 8 0 4 2 0 8 0 00 0 1 0 0 * 0 1 0 = 0 1 00 0 0 0 70 1 0 0 0 0 00 0 04.【实现提示】(1)首先应输入矩阵的行数和列数,并判别给出的两个矩阵的行,列数对于所要求作的运算是否匹配,可设矩阵的行数和列数均不超过20。
(2)程序可以对三元组的输入顺序加以限制,例如,按行优先。
(3)在用三元组表示稀疏矩阵时,相加或相减所得结果矩阵应该另生成,乘积矩阵也可用二维数组存放。
1.设定数组的抽象数据类型定义:ADT SparseMatrix{数据对象:D={ m和n分别称为矩阵的行数和列数} 数据关系:R={Row,Col}Row={<ai,j ,ai,j+1>|1<=i<=m,a<=j<=n-1 }Col={<ai,j ,ai+1,j>|1<=i<=m-1,a<=j<=n }基本操作:CreateSMatrix(&M);操作结果:创建稀疏矩阵M。
数据结构课程设计 报告 (十字链表实现稀疏矩阵的加法)
![数据结构课程设计 报告 (十字链表实现稀疏矩阵的加法)](https://img.taocdn.com/s3/m/6f27de72a417866fb84a8e17.png)
一、问题描述十字链表实现稀疏矩阵的加法1、功能要求:根据用户输入的矩阵,实现稀疏矩阵的求和运算,并输出结果。
2、输入要求:矩阵的数据在程序运行的时候由用户提供,先由用户输入稀疏矩阵的行数、列数和非零元个数。
再根据非零元个数,输入这些非零元,还需要用户为这些非零元输入行、列和非零元的值。
这样,一个稀疏矩阵就输入完成。
若输入4 3 2则表示这个稀疏矩阵有4行3列2个非零元然后用户需要为这两个非零元输入行、列、非零元的值如:1 2 24 1 1表示第一个非零元行为1,列为2,,值为2;第二个非零元行为4,列为1,值为1。
此过程输入的稀疏矩阵为:0 2 00 0 00 0 01 0 03、输出要求:输出按矩阵输出,按行列依次输出,非零元则输出非零元的值,不是非零元则输出“0”。
各元素之间用空格隔开。
最后输出完整的矩阵。
二、概要设计1.稀疏矩阵的抽象数据类型定义如下:ADT SparseMatrix {数据对象: D={a ij|i=1,2,3……m,j=1,2,3……n;a ij属于ElemSet,m和n分别是稀疏矩阵的行数和列数}数据关系: R={ Row, Col }Row={<a ij,a ij+1>|1<=i<=m,1<=j<=n-1}Col={<a ij,a i+1j>|1<=i<=m-1,1<=j<=n}基本操作:CreateSMatrix(&M);//建立稀疏矩阵MDestroySMatrix(&M);//销毁稀疏矩阵M;TransposeSMatrix(M);//求稀疏矩阵的转置矩阵AddSMatrix(&M,&N);//求稀疏矩阵M和N之和MulSMatrix(&M,&N);//求稀疏矩阵M和N之积}ADT SparseMatrix2、存储结构选择采用十字链表存储稀疏矩阵,它是稀疏矩阵链式表示的一种较好的表示方法。
数据结构程序设计-矩阵的运算
![数据结构程序设计-矩阵的运算](https://img.taocdn.com/s3/m/c2cd80f34028915f814dc22d.png)
二.概要设计:
1、抽象数据类型定义如下: ADT SparseMatrix{ 数据对象D:D={aij|i=1,2,3…,m;j=1,2,3…,n; ai ∈ElemSet,m和n分别称为矩阵的行数和列数} 数据关系R: R={Row,Col} Row={<ai,j,ai,j+1>|1≤i≤m, 1≤j≤n-1} Col={<ai,ai+1,j>|1≤i≤m-1, 1≤j≤n} 基本操作 本程序中,用三元组顺序表作为存储结构。 (1)、CreatSMatrix (TSMatrix &M) 操作结果:创建矩阵M。 (2)、AddSMatrix(TSMatrix A,TSMatrix B,TSMatrix &C,int n) 初始条件:矩阵A和B的行数和列数对应相等。 操作结果:求矩阵A、B的和C=A+B。 (3)、SubMatrix (TSMatrix *a,TSMatrix *b) 初始条件:矩阵A和B的行数和列数对应相等。 操作结果:求矩阵A、B的和C=A+B。 (4)、MultiplicationMatrixPow (TSMatrix *a,TSMatrix *b,TSMatrix *c) 初始条件:矩阵A和B的行数和列数匹配 操作结果:求矩阵A、B的和C=A*B。 (5) OutputSMatrix(TSMatrix M) 初始条件:矩阵M已存在 操作结果:输出矩阵M 2、 本程序包含5个模块
for(i=1;i<=M->mu;i++)//输出矩阵 { for(j=1;j<=M->nu;j++) printf("%5d",a[i][j]); printf("\n"); } } //*************矩阵的求和运算*****************// int AddSMatrix(TSMatrix *M,TSMatrix *N,TSMatrix *Q)//求 采用三元组顺序表存储表示的稀疏矩阵M和N的和,结果赋给矩阵Q { int i,j,p,q,x=0,y=0; if((M->mu<=0)||(M->nu<=0)||(M->tu<=0)||(N->mu<=0)||(N>nu<=0)||(N->tu<=0))//判断行数列数非零元素个数是否符合匹配 return ERROR; if(M->mu!=N->mu||M->nu!=N->nu)//判断A与B的行列数 是否相等的 return ERROR; Q->mu=M->mu;//矩阵Q的初始化 Q->nu=M->nu; Q->tu=0; for(i=1;i<=Q->mu;i++) { for(j=1;j<=Q->nu;j++)//寻找矩阵M,N中非零元素相等 的行列 { for(p=1;p<=M->tu;p++)//求矩阵M行列中所对应的 非零元素的值 赋值给X { if((i==M->data[p].row)&&(j==M->data[p].col))// 如果i是矩阵M中非零元素行,j是其列 { x=M->data[p].e;
数据结构课程设计 特殊矩阵运算
![数据结构课程设计 特殊矩阵运算](https://img.taocdn.com/s3/m/a46ee81779563c1ec5da71f7.png)
特殊矩阵运算1.1程序功能简介对特殊矩阵能够在界面上以人们熟悉的方式显示,可以对特殊矩阵进行加法运算和减法运算,矩阵转置。
按照要求使用了多种数据结构来求解问题,具体为二维数组和类似图的数据结构。
由于题目要求使用多种数据结构,因此分开写了两段程序,均实现了上述要求的功能,以下将分开说明。
先说明的是用二维数组实现的程序,后说明的是用图结构实现的程序。
1.2关于输入、输出形式及数据范围1.2.1使用二维数组实现的程序输入、输出范围为:-73786976294838206000到73786976294838206000,足以解决绝大多数的矩阵运算问题。
1.2.2输入的格式进入程序后首先展现的是功能选择界面,如下图:此时可通过输入对应功能的数字来选择功能。
在此程序中不同功能输入格式不同:选择功能 1.矩阵转置时需要输入要进行转置操作的矩阵,首先输入矩阵的行数和列数,以逗号隔开,之后依次按矩阵形式输入矩阵即可,各数值之间以空格隔开。
选择功能2.矩阵数乘时需要输入要进行数乘操作的矩阵,此输入格式同上,之后输入一个实数,即要进行数乘的数即可。
功能3.矩阵加法与4.矩阵减法输入格式和5.矩阵乘法相同,按上述操作输入两个矩阵即可,需要注意的是矩阵减法默认顺序为先输入的矩阵减去后输入的矩阵。
当按照格式输入时可以实现以上功能,但输入错误数据时,例如进行行列数不同的矩阵相加减时则会返回无法操作,请重新输入的提示。
具体情况见下文测试部分。
1.3.1使用图结构实现的稀疏矩阵运算器程序输入、输出范围同上。
1.3.2输入的格式进入程序后首先展现的是功能选择界面,如下图:选择功能部分输入同上。
在进行矩阵输入时采取三元组的形式,这是由于稀疏矩阵的多零元性质。
首先输入矩阵的行数、列数、非零元个数,以空格隔开,输入完毕后确认,开始输入各个非零元。
输入非零元时按“所在行下标所在列下标值”的形式输入,需要注意的是输入时只能从所在行小的开始按顺序输入,不能先输入行数大的数据再输入行数小的数据。
数据结构----稀疏矩阵运算器课程设计.
![数据结构----稀疏矩阵运算器课程设计.](https://img.taocdn.com/s3/m/46034dccfab069dc502201a6.png)
数据结构----稀疏矩阵运算器课程设计目录稀疏矩阵运算器设计 (I)摘要 ................................................................................................................... I I 第一章需求分析 (1)第二章概要设计 (2)第三章设计步骤 (6)3.1 函数说明 (6)3.2 设计步骤 (7)第四章设计理论分析方法 (20)4.1 算法一:矩阵转置 (20)4.2 算法二:矩阵加法 (20)4.3 算法三:矩阵乘法 (21)第五章程序调试 (23)第六章心得体会 (25)参考文献 (26)第一章需求分析1.稀疏矩阵是指那些多数元素为零的矩阵。
利用“稀疏”特点进行存储和计算可以大大节省存储空间,提高计算效率。
实现一个能进行稀疏矩阵基本运算的运算器。
2.以“带行逻辑链接信息”的三元组顺序表表示稀疏矩阵,实现矩阵转置,求逆,实现两个矩阵相加、相减和相乘的运算。
稀疏矩阵的输入形式采用三元组表示,而运算结果的矩阵则以通常的阵列形式列出。
3.演示程序以用户和计算机的对话方式执行,数组的建立方式为边输入边建立。
4.由题目要求可知:首先应输入矩阵的行数和列数,并判别给出的两个矩阵的行、列数对于所要求作的运算是否相匹配。
5.程序可以对三元组的输入顺序不加以限制;根据对矩阵的行列,三元组作直接插入排序,从而进行运算时,不会产生错误。
6.在用三元组表示稀疏矩阵时,相加、乘积和相减所得结果矩阵应该另生成;矩阵求逆时,为了算法方便,使用二维数组存放。
7.程序在VC6.0环境下设计。
程序执行的命令为:1.稀疏矩阵转置; 2.稀疏矩阵加法; ;3. 稀疏矩阵乘法; 4.退出的工作。
第二章概要设计1.抽象数据类型稀疏矩阵的定义如下:ADT SparseMatrix{数据对象:D={a ij|i=1,2,…,m; j=1,2,…,n;a ij∈ElemSet, 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+1,j﹥| 1≤i≤m-1, 1≤j≤n}基本操作:create(TSMatrix &TM)操作结果:创建稀疏矩阵矩阵TMLocateELem(TSMatrix M,int i,int j,int e)初始条件:稀疏矩阵M存在操作结果:稀疏矩阵中是否存在非零元素A[i][j],若存在返回edisp(TSMatrix TM)初始条件:稀疏矩阵TM存在操作结果:通常形式输出稀疏矩阵InsertSortMatrix(TSMatrix &TM)初始条件:稀疏矩阵TM存在操作结果:根据对矩阵的行列,三元组TM作直接插入排序TransposeSMatrix(TSMatrix M,TSMatrix &T)初始条件:稀疏矩阵M和T存在操作结果:求稀疏矩阵M转置的稀疏矩阵TAddTSM(TSMatrix A,TSMatrix B,TSMatrix &C)初始条件:稀疏矩阵A,B和C存在操作结果:稀疏矩阵的加法运算:C=A+BSubTSM(TSMatrix A,TSMatrix B,TSMatrix &C)初始条件:稀疏矩阵A,B和C存在操作结果:稀疏矩阵的减法运算:C=A-BMultSMatrix(TSMatrix A,TSMatrix B,TSMatrix &C)初始条件:稀疏矩阵A,B和C存在操作结果:稀疏矩阵的乘法运算:C=A×BNiMatrix(TSMatrix &TM)初始条件:稀疏矩阵TM存在操作结果:稀疏矩阵求逆}ADT SparseMatrix;2. 主程序:void main( ){初始化;do {接受命令;选择处理命令;}while(命令!=“退出”) }3. 本程序有四个模块,调用关系如下:图2.1 4 本程序的流程图图2.2第三章设计步骤3.1函数说明稀疏矩阵的三元组顺序表存储表示:typedef struct // 定义三元组的元素{int i,j;int v;}Triple;class tripletable{ //设计类来描述稀疏矩阵及其操作public:aaa *pdata;triple data[maxsize];int rpos[maxsize]; tripletable();~tripletable();void convert() ;void add( );void multi ( );private:int m ;int n ;int t ;int a ;};主要函数:tripletable();~tripletable();void convert( ) ;void add( );void multi ( );void main( );3.2设计步骤:设计一个矩阵类实现矩阵的运算:class tripletable(包含矩阵的各种运算函数)。
数据结构课程设计--基本稀疏矩阵运算的运算器
![数据结构课程设计--基本稀疏矩阵运算的运算器](https://img.taocdn.com/s3/m/98d735a62cc58bd63086bd24.png)
数据结构课程设计--基本稀疏矩阵运算的运算器数据结构课程设计五班级:06计本(1)姓名:魏建平学号:20060724035题目:严蔚敏习题实习4第1个:实现一个能进行基本稀疏矩阵运算的运算器一、需求分析1、本程序实现一个基本稀疏矩阵的简单运算,包括加、减、乘。
2、执行操作前应先创造要进行运算的两个矩阵,然后再选择进行相应的操作。
3、以三元组顺序表表示稀疏矩阵,实现二个矩阵相加,相减,相乘的运算;稀疏矩阵的输入形式为三元组表示,运算结果则为通常的阵列形式列出!4、首先输入矩阵的行数和列数,并判别给出的两个矩阵和行、列数对于所要求作的运算是否相匹配。
可设矩阵的行数和列数均不超过20;5、程序先给出了菜单项,用户只需按照菜单提示进行相应的操作就行了。
6、测试数据:二、概要设计1、抽象数据类型三元组的定义如下:ADT Triple{数据对象:D={ai|ai(-ElemSet,i=1,2,...,n,n>=0};数据关系:R1={<ai-1,ai>| ai-1,ai(- D,i=2,...,n}基本操作:略}2、基于三元组顺序表表示的矩阵操作:(1)创建三元组顺序表表示的矩阵:void createMatrix(TSMatrix &A)(2)初始化矩阵:void initMatrix(TSMatrix &A)(3)相加:void add(TSMatrix A,TSMatrix B,TSMatrix &C)(4)相减:void sub(TSMatrix A,TSMatrix &B,TSMatrix &C)(5)找m行n列元素在A中顺序表中的位置:int search(TSMatrix A,int m,int n) (6)相乘;void mult(TSMatrix A,TSMatrix B,TSMatrix &C)(7)输入以阵列形式表示的矩阵:void print(TSMatrix A)3、主程序Void main(){While(true){调用相应函数执行相应操作;输出操作结果;}}4、本程序只有两个模块,调用关系简单:三、详细设计1、三元组结构描述:#define MAXSIZE 20 using namespace std;typedef struct{int row;int col;int e;}Triple;typedef struct{Triple date[MAXSIZE];int m,n,len;}TSMatrix;void initMatrix(TSMatrix &A){A.len=0;A.m=0;A.n=0;for(int i=0;i<MAXSIZE;i++){A.date[i].col=0;A.date[i].e=0;A.date[i].row=0;}}2、各种操作函数源代码:void createMatrix(TSMatrix &A){initMatrix(A);cout<<"创建矩阵:";cout<<"请输入矩阵的行列值及非0元素个数\n";cin>>A.m>>A.n>>A.len;for(int i=0;i<A.len;i++){cout<<"请输入第"<<i<<"个非0元素对应的行、列、值:";cin>>A.date[i].row;cin>>A.date[i].col;cin>>A.date[i].e;}}void add(TSMatrix A,TSMatrix B,TSMatrix &C)//相加{if(A.m==B.m&&A.n==B.n){int i=0,j=0;int k=0;C.m=A.m;C.n=A.n;while( i<A.len||j<B.len){if(i==A.len&&j<B.len){C.date[k].col=B.date[j].col;C.date[k].row=B.date[j].row;C.date[k++].e=B.date[j].e;C.len++;j++;}else if(i<A.len&&j==B.len){C.date[k].col=A.date[i].col;C.date[k].row=A.date[i].row;C.date[k++].e=A.date[i].e;C.len++;i++;}else{if(A.date[i].row>B.date[j].row){C.date[k].col=B.date[j].col;C.date[k].row=B.date[j].row;C.date[k++].e=B.date[j].e;C.len++;j++;}else if(A.date[i].row<B.date[j].row) {C.date[k].col=A.date[i].col;C.date[k].row=A.date[i].row;C.date[k++].e=A.date[i].e;C.len++;i++;}else{if(A.date[i].col==B.date[j].col) {if(A.date[i].e+B.date[j].e!=0){C.date[k].col=A.date[i].col;C.date[k].row=A.date[i].row;C.date[k++].e=A.date[i].e+B.date[j].e;C.len++;}i++;j++;}else if(A.date[i].col>B.date[j].col){C.date[k].col=B.date[j].col;C.date[k].row=B.date[j].row;C.date[k++].e=B.date[j].e;C.len++;j++;}else if(A.date[i].col<B.date[j].col){C.date[k].col=A.date[i].col;C.date[k].row=A.date[i].row;C.date[k++].e=A.date[i].e;C.len++;i++;}}}}}else{cout<<"不能相加!";}}void sub(TSMatrix A,TSMatrix &B,TSMatrix &C)//相减{for(int k=0;k<B.len;k++){B.date[k].e=-B.date[k].e;}if(A.m==B.m&&A.n==B.n){add(A,B,C);}elsecout<<"不能相减!";for( k=0;k<B.len;k++){B.date[k].e=-B.date[k].e;}}int search(TSMatrix A,int m,int n){int flag=-1;for(int i=0;i<MAXSIZE;i++){if(A.date[i].row==m&&A.date[i].col==n) {flag=i;break;}}return flag;}void mult(TSMatrix A,TSMatrix B,TSMatrix &C)//相乘{int i=0,j=0;if(A.n==B.m){C.m=A.m;C.n=B.n;for(i=0;i<A.len;i++){for(j=0;j<B.len;j++){if(A.date[i].col==B.date[j].row) {intflag=search(C,A.date[i].row,B.date[j].col);if(flag==-1){C.date[C.len].col=B.date[j].col;C.date[C.len].row=A.date[i].row;C.date[C.len++].e=A.date[i].e*B.date[j].e;}else{C.date[flag].e=C.date[flag].e+A.date[i].e*B. date[j].e;}}}}}else{cout<<"不能相乘!"<<endl;}}void print(TSMatrix A){int k=0;int i,j;int M[MAXSIZE][MAXSIZE];for(i=0;i<A.m;i++){for(j=0;j<A.n;j++){M[i][j]=0;}}while(k<A.len){M[A.date[k].row-1][A.date[k].col-1]=A.dat e[k].e;k++;}for(i=0;i<A.m;i++){cout<<"| ";for(j=0;j<A.n;j++){cout<<M[i][j]<<" ";}cout<<"|"<<endl;}}void showtip(){cout<<"------------请选择要执行的操作--------"<<endl;cout<<endl;cout<<" 0---创建矩阵"<<endl;cout<<" 1---A+B"<<endl; cout<<" 2---A-B"<<endl; cout<<" 3---A*B"<<endl; cout<<" 4---退出"<<endl; cout<<"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"<<endl;}3、主函数:void main(){TSMatrix A,B,C;initMatrix(A);initMatrix(B);initMatrix(C);showtip();int i;cin>>i;while(true){switch(i){case 0:system("cls");cout<<"创建矩阵A:"<<endl;createMatrix(A);c out<<"创建矩阵B:"<<endl;c reateMatrix(B);showtip();break;case 1:system("cls");if(A.m==0||B.m==0){cout<<"未建矩阵"<<endl; }else{initMatrix(C);add(A,B,C);if(A.m==B.m&&A.n==B.n) {cout<<"加的结果;"<<endl; print(A);cout<<"+"<<endl;;print(B);cout<<"="<<endl;print(C);}}showtip();break;case 2:system("cls");if(A.m==0||B.m==0){cout<<"未建矩阵"<<endl; }else{initMatrix(C);sub(A,B,C);cout<<"减的结果;"<<endl; print(A);cout<<"+"<<endl;;print(B);cout<<"="<<endl;print(C);}showtip();break;case 3:system("cls");if(A.m==0||B.m==0){cout<<"未建矩阵"<<endl;}else{initMatrix(C);mult(A,B,C);if(A.n==B.m){cout<<"乘后的结果;"<<endl;print(A);c out<<"*"<<endl;print(B);c out<<"="<<endl;p rint(C);}}showtip();break;case 4:exit(0);break;}cin>>i;}}四、调试分析1、由于本程序涉及的函数比较多,所以开始时在函数调用上出现了混乱,把自己都给搞糊涂了,后来经仔细排查,最终发现了错误。
数据结构课程设计报告n维矩阵乘法
![数据结构课程设计报告n维矩阵乘法](https://img.taocdn.com/s3/m/0b1c62ebe518964bce847ca1.png)
数据结构课程设计报告设计题目:n维矩阵乘法:A B-1专业计算机科学与技术班级计051本学生林垂敏学号29指导教师潘崇起止时间2007-2008 学年第I学期一、具体任务功能:设计一个矩阵相乘的程序,首先从键盘输入两个矩阵a,b的内容,并输出两个矩阵,输出ab-1结果。
分步实施:1.初步完成总体设计,搭好框架,确定人机对话的界面,确定函数个数;2.完成最低要求:建立一个文件,可完成2维矩阵的情况;3.进一步要求:通过键盘输入维数n。
有兴趣的同学可以自己扩充系统功能。
要求:1.界面友好,函数功能要划分好2.总体设计应画一流程图3.程序要加必要的注释4.要提供程序测试方案5.程序一定要经得起测试,宁可功能少一些,也要能运行起来,不能运行的程序是没有价值的。
二、软件环境Microsoft Visual C++ 6.0三、问题的需求分析程序以二维数组作为矩阵的存储结构,通过键盘输入矩阵维数n,动态分配内存空间,创建n维矩阵。
矩阵建立后再通过键盘输入矩阵的各个元素值;也可以通过文件读入矩阵的各项数据(维数及各元素值)。
当要对矩阵作进一步操作(A*B或A*B^(-1))时,先判断内存中是否已经有相关的数据存在,若还未有数据存在则提示用户先输入相关数据。
当要对矩阵进行求逆时,先利用矩阵可逆的充要条件:|A| != 0 判断矩阵是否可逆,若矩阵的行列式|A| = = 0 则提示该矩阵为不可逆的;若|A| !=0 则求其逆矩阵,并在终端显示其逆矩阵。
四、算法设计思想及流程图1.抽象数据类型ADT MatrixMulti{数据对象:D = {a(I,j)|i = 1,2,3,…,n;j = 1,2,…,n;a(i,j)∈ElemSet,n为矩阵维数}数据关系: R = {Row,Col}Row = {<a(i,j),a(i,j+1)>| 1 <= i <= n , 1 <= j <= n-1}Col = {<a(i,j),a(i+1,j)>| 1 <= i <= n-1 , 1 <= j <= n} 基本操作:Swap(&a,&b);初始条件:记录a,b已存在。
矩阵运算c语言课程设计
![矩阵运算c语言课程设计](https://img.taocdn.com/s3/m/90f937d0a1116c175f0e7cd184254b35eefd1ad1.png)
矩阵运算c语言课程设计一、课程目标知识目标:1. 学生能够理解矩阵的基本概念,掌握矩阵的存储方式和基本运算原理。
2. 学生能够掌握C语言中二维数组的使用,并将其应用于矩阵的表示和运算。
3. 学生能够运用所学知识,实现矩阵的加、减、乘、转置等基本运算。
技能目标:1. 学生能够运用C语言编写程序,实现矩阵的各种运算,提高编程能力。
2. 学生能够通过分析问题,设计合理的算法,解决矩阵相关的问题。
3. 学生能够利用调试工具检查并修正程序中的错误,提高解决问题的能力。
情感态度价值观目标:1. 学生在学习过程中,培养对编程的兴趣和热情,形成积极的学习态度。
2. 学生通过团队协作和交流,培养合作精神和沟通能力,提高团队意识。
3. 学生在学习过程中,感受计算机科学的魅力,树立科学精神,增强对科技创新的认识。
课程性质:本课程为计算机科学与技术领域的专业课程,旨在让学生掌握矩阵运算的C语言实现,提高编程能力。
学生特点:学生已具备C语言基础,具有一定的编程能力和问题解决能力。
教学要求:通过本课程的学习,学生应能独立完成矩阵运算的编程任务,具备解决实际问题的能力。
教师应注重理论与实践相结合,引导学生主动参与,培养其创新思维和团队合作能力。
在教学过程中,关注学生的个体差异,因材施教,确保每位学生都能达到课程目标。
二、教学内容1. 矩阵基础知识:矩阵的定义、存储方式、基本运算(加、减、乘、转置)。
- 教材章节:第二章 矩阵及其运算2. C语言二维数组:二维数组的声明、初始化、访问,以及与矩阵的关联。
- 教材章节:第一章 C语言基础回顾3. 矩阵运算的C语言实现:- 矩阵加法:编写程序实现矩阵的加法运算- 矩阵减法:编写程序实现矩阵的减法运算- 矩阵乘法:编写程序实现矩阵的乘法运算- 矩阵转置:编写程序实现矩阵的转置运算- 教材章节:第三章 矩阵运算的C语言实现4. 矩阵运算程序调试与优化:- 算法优化:分析算法性能,提高程序运行效率- 调试技巧:运用调试工具,查找并修正程序错误- 教材章节:第四章 程序调试与优化教学内容安排与进度:1. 矩阵基础知识(2课时)2. C语言二维数组(2课时)3. 矩阵运算的C语言实现(4课时)- 矩阵加法(1课时)- 矩阵减法(1课时)- 矩阵乘法(2课时)- 矩阵转置(1课时)4. 矩阵运算程序调试与优化(2课时)三、教学方法1. 讲授法:教师通过讲解矩阵的基本概念、运算原理以及C语言二维数组的使用方法,为学生奠定坚实的理论基础。
矩阵运算教案
![矩阵运算教案](https://img.taocdn.com/s3/m/5967968359f5f61fb7360b4c2e3f5727a5e92480.png)
矩阵运算教案【引言】矩阵运算是线性代数的重要概念之一,它在数学和工程领域中具有广泛的应用。
为了帮助学生理解和掌握矩阵运算的基本原理和操作方法,本教案将系统地介绍矩阵的加法、减法、乘法等运算规则,并提供实例演示和练习题,帮助学生巩固所学知识。
【第一部分:矩阵的加法和减法】矩阵的加法和减法是指将两个相同维度的矩阵进行对应元素的相加或相减操作。
下面分别介绍矩阵的加法和减法的规则:1. 矩阵加法规则:对于两个相同维度的矩阵A和B,它们的加法定义为:A +B = C,其中矩阵C的每个元素 c(ij) 等于矩阵A和B对应位置元素的和,即 c(ij) = a(ij) + b(ij)。
2. 矩阵减法规则:对于两个相同维度的矩阵A和B,它们的减法定义为:A -B = C,其中矩阵C的每个元素 c(ij) 等于矩阵A和B对应位置元素的差,即 c(ij) = a(ij) - b(ij)。
【第二部分:矩阵的乘法】矩阵的乘法是指将两个矩阵按照一定的规则相乘得到一个新矩阵的操作。
下面介绍矩阵的乘法规则:1. 矩阵乘法规则:对于一般情况下的矩阵乘法,若A为m×n的矩阵,B为n×p的矩阵,则它们的乘积C为一个m×p的矩阵,其元素c(ij)为A的第i行与B的第j列的内积,即c(ij) = Σ(a(ik) * b(kj)),其中k取值范围为1到n。
2. 矩阵乘法的性质:矩阵乘法满足结合律,但不满足交换律,即A×B≠B×A。
另外,矩阵乘法满足分配律,即A×(B+C) = A×B + A×C。
【第三部分:矩阵的转置】矩阵的转置是指将矩阵的行列交换得到的新矩阵。
下面介绍矩阵的转置操作:1. 矩阵转置规则:对于一个m×n的矩阵A,其转置矩阵记为A^T,即将A的第i行与第i列对应元素交换,得到新矩阵的第j行第i列元素与原矩阵相同,即 a(ji) = a(ij)。
矩阵的简单运算(课程设计论文)
![矩阵的简单运算(课程设计论文)](https://img.taocdn.com/s3/m/e804c36727d3240c8447ef71.png)
课 程 设 计学 号: 200940410101题 目矩阵乘法教 学 院计算机学院 专 业09计算机科学与技术 班 级 09计科(1)班姓名张祥 指导教师祁文青2010 年 12 月 25 日课程设计(论文)课程设计任务书(2010~2011学年第一学期)学生姓名:张祥专业班级:09计算机科学与技术(1)班指导教师:祈文青工作部门:计算机学院一、课程设计题目矩阵乘法二、课程设计内容1.矩阵的存储2.矩阵的乘法3.矩阵的的加法与减法三、进度安排1.分析问题,给出数学模型,选择数据结构.2.设计算法,给出算法描述3.给出源程序清单4. 编辑、编译、调试源程序5. 撰写课程设计报告四、基本要求1.用C语言实现矩阵的运算.2.利用链表实现矩阵运算的存储.3.该程序具有加法、减法、乘法基本运算功能.4. 程序的各个功能模块要求用函数的形式实现.5. 完成设计任务并书写课程设计报告。
教研室主任签名:年月日课程设计(论文)目录一、作品及人员信息 (3)二、概述 (3)三、设计目的 (3)四、运行/开发环境 (3)五、流程图 (4)六、功能介绍 (5)七、算法分析 (5)八、测试过程中所用过的数据及说明 (9)九、使用价值及优点 (11)十、总结 (11)附录(一):参考文献 (11)附录(二):成绩评定表 (12)课程设计(论文)一、作品及人员信息1、开发项目的名称:矩阵乘法2、本项目的提出者:祈文青3、本项目的开发者:张祥、张宁、黄小强、龚江华二、概述数据结构是一门理论性强、思维抽象、难度较大的课程,是基础课和专业课之间的桥梁只有进行实际操作,将理论应用于实际中,才能确实掌握书中的知识点。
通过课程设计,不仅可以加深学生对数据结构基本概念的了解,巩固学习成果,还能够提高实动手力。
为学生后继课程的学习打下良好的基础。
三、设计目的1. 使学生能够较全面地巩固和应用课堂中所学的的基本理论和程序设计方法,能够较熟练地完成程序的设计和调试。
课程设计--设计一个矩阵运算器
![课程设计--设计一个矩阵运算器](https://img.taocdn.com/s3/m/b31df5e0e87101f69f31953a.png)
课程设计--设计一个矩阵运算器《数据结构C语言版》课程设计一、题目内容的描述设计一个矩阵运算器【问题描述】设计一个矩阵运算器,对矩阵进行乘方(^)、加(+)、减(-)、乘(*)、转置等运算;【基本要求】(1) 参见数据结构题集P136页4.1(2) 求含有乘方(^)、加(+)、减(-)、乘(*)运算;。
(3) 写出课程设计报告【测试数据】分别选定一组测试数据进行测试,验证程序的正确性。
二、应用程序功能的详细说明1(输入矩阵运算器:说明该程序只适用于矩阵运算;2. 提供功能选择的界面:以菜单的形式提供功能选择,可以对所要进行的功能进行选择,最后系统自动实行此操作。
3. 矩阵的加法:先创建两个矩阵,要求两个矩阵的行和列分别相等。
调用矩阵的加法函数,系统自动输出新的相加后的矩阵。
4. 矩阵的减法:先创建两个矩阵,要求两个矩阵的行和列分别相等。
调用矩阵的减法函数,系统自动输出新的相减后的矩阵。
5.矩阵的乘法:先创建两个矩阵,要求第一个矩阵的列和第二个矩阵的行相等。
调用矩阵的乘法函数,系统自动输出新的相乘后的矩阵。
6. 矩阵的转置:先创建矩阵,输入矩阵的行和列数,调用矩阵的转置函数,系统自动输出新的转置后的矩阵。
7. 方阵的乘方:先创建一个方阵,输入方阵的阶乘,调用方阵的乘方函数,然后系统自动输出新的方阵。
三、输入数据类型、格式和内容{const int Max=100;int a[Max][Max],b[Max][Max],g[Max][Max],c[Max][Max],h[Max][Max];} Const int Max=100;定义矩阵的最大存储空间为100;int a[Max][Max],b[Max][Max],g[Max][Max],c[Max][Max],h[Max][Max];在函数中定义五个矩阵。
四、主要函数申明void createjuzheng(int d[Max][Max],int m,int n)创建矩阵函数;void shuchujuzheng(int z[Max][Max],int m,int n)输出矩阵函数;void juzhengchengfang(int m,int n,int p)矩阵乘方函数;void juzhengjiafa(int m,int n) 矩阵加法函数;void juzhengjianfa(int m ,int n) 矩阵减法函数;void juzhengchengfa(int m,int n) 矩阵乘法函数;void juzhengzhuanzhi(int m,int n) 矩阵转置函数;switch(o)创建矩阵运算菜单。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构课程设计报告题目:_____________________________________专业:_____________________________________班级:_____________________________________学号:_____________________________________姓名:_____________________________________指导老师:__________________________________时间:_____________________________________、课程设计题目及所涉及知识点设计题目是“矩阵的运算” ,所涉及的知识点主要是:1、数据结构中的对于结构体的定义,用typedef struct 来实现,根据所设计的问题在结构体里面定义数据类型及其变量,用define 定义数组的大小,然后利用typedef 来实现对于变量的未知类型确定正确的类型。
2、利用数组的形式来储存数据,在实现不同操作过程中,有的用一维结构体数组(三元组顺序表)来存储,有的用二维数组来储存。
3、转置的过程中利用的是快速转置的方法,附设了num 和cpot 两个辅助变量。
4、矩阵的加法、减法、乘法、逆运算的基本算法方式。
5、通过调用每个函数,来实现每个算法的功能。
、课程设计思路及算法描述设计思路:1、首先是对于转置的考虑,要运用快速转置的方法实现,必须用三元组顺序表来储存数据,所以在第一个结构体中存在int 类型的行数(mu )列数(nu )以及非零元素的个数(tu );然后第二个结构体中分别有非零元素的行下标(i)、列下标(j)和元素数值(e),最后在第一个结构体中实现对第二个结构体成为数组结构体类型。
2、对于其余加法、减法、乘法和逆运算则是运用另一个结构体来实现,里面只有矩阵的行数、列数和一个二维数组(用float 来定义类型)。
3、在main 函数里面,来实现对于数据的输入操作,利用if 语句进行选择来执行操作,利用do ........ w hile语句来实现功能的循环操作。
4、分五个函数调用分别来实现转置、加法、乘法、和逆运算,每个里面都有最终输出结果的方式。
算法1:矩阵的转置输入:mu中存放矩阵的行数,tu存放矩阵的列数,i接收行下标的数值,j接收列下标的数值, e 来存储数据。
输出:转置后的新矩阵。
输入两行两列数据,在第二行第一列中有个数据为12,其余都为0,则输出的结果为第一行第二列数据为12,其余为0。
算法2:矩阵的加法运算输入:i中存放矩阵的行数,j中存放矩阵的列数,二维数组b中存放每个数据。
输出:矩阵加完后的另一个新矩阵。
输入两个两行三列的矩阵,在第一个矩阵里面第一行第一列有个数据20,其余为0,在第二个矩阵里面第一行第二列中有个数据30,其余为0,则输出的结果为一个两行三列的矩阵,其中第一行第一列数据为20,第一行第二列数据为30,其余为0。
算法3:矩阵的减法运算输入:i 中存放矩阵的行数,j 中存放矩阵的列数,二维数组 b 中存放每个数据。
输出:矩阵相减后的另一个新矩阵。
输入两个两行三列的矩阵,在第一个矩阵里面第一行第一列有个数据20,其余为0,在第二个矩阵里面第一行第一列中有个数据30,其余为0,则输出的结果为一个两行三列的矩阵,其中第一行第一列数据为-10,其余为0。
算法4:矩阵的乘法运算输入:i 中存放矩阵的行数,j 中存放矩阵的列数,二维数组 b 中存放每个数据。
输出:矩阵加完后的另一个新矩阵。
输入两行两列的矩阵,第一个矩阵里面第一行第一列有个数据 2 第二列有个数据3,其余为0,在第二个矩阵里面第一行第一列有个数据 2 第二列中有个数据3,其余为0,则输出的结果为一个两行两列的矩阵,其中第一行第一列数据为4 ,第二列为6,第一行第二列数据为30 ,其余为0。
算法五:矩阵的逆运算输入:i中存放矩阵的行数,j中存放矩阵的列数,二维数组b中存放每个数据。
输出:矩阵进行逆运算完后的另一个新矩阵。
输入三行三列的矩阵,第一个矩阵里面第一行第一列有个数据 3 个数据分别为1,2,3;第二行的数据分别为2,2,1;第三行的暑假分别为3,4,3;则输出的结果为三行三列矩阵,其中第一行的数据为1,3,-2;第二行的数据分别为-1.5,-3,2.5;第三行的数据分别为1,1,-1。
三、课程设计中遇到的难点及解决办法1、在转置的过程中,要求把转置后的矩阵输出出来,因为用的是三元组顺序表的存储形式,所以不知道怎么去实现,然后通过进一步思考,运用先把一个矩阵存入零元素,然后在对其进行更改,最后完成了此项的工作。
2、就是对于矩阵的乘法运算和逆运算,掌握的不够熟练,先是通过书籍对于矩阵的乘法和逆运算得到更深的了解,然后通过一步步写程序最后实现了矩阵的乘法运算和逆运算。
四、总结通过此次课程设计,让我对于编程有了更深的认识,老师的精心指导让我学会到了很多,不仅仅是代码,最主要的让我的思维开阔了很多,在这个过程中,通过不断的尝试,不断的修改,最终克服了困难,完成了自己的任务,心里有种无比的喜悦,但同时又感觉到了自己的知识面的狭隘,还有好多知识的海洋还没有畅游,等待自己将是一回更大的考验。
对于现在的自己,对学习程序还是有很大的兴趣,它让我体验到了很多的快乐,我要进步跟进现在的课程,努力去发展自己,按照老师说的最主要的是具有了编程的思想,则具有了编程的能力,我想我可以成功完成自己的目标。
五、附录—主要源程序代码及运行结果1、主要源程序代码: # include <stdio.h># define max 100# define maxsize 100 typedef float elemtype;typedef struct{ float b[max][max];int i;// 矩阵的行数int j;// 矩阵的列数} tsmatrix;typedef struct {int i,j;// 该非零元的行下标和列下标elemtype e;}triple;typedef struct{ triple data[maxsize+1];// 非零元三元组,data[0] 未用int mu,nu,tu;// 矩阵的行数、列数和非零元个数}sqlist ;void zhuanzhi(sqlist s1,tsmatrix &l2)// 矩阵的转置{ sqlist s2;int col,t9,p,q,a1,b1;int num[100],copt[100]; s2.mu=s1.mu;s2.nu=s1.nu;s2.tu=s1.tu;if(s2.tu>0){ for(col=1;col<=s1.nu;++col) num[col]=0;for(t9=1;t9<=s1.tu;++t9)++num[s1.data[t9].j];// 求s1 中每一列含非零元个数copt[1]=1;// 求第col 列中第一个非零元在s2.data 中序号for(col=2;col<=s1.nu;++col) copt[col]=copt[col-1]+num[col-1];for(p=1;p<=s1.tu;++p){ col=s1.data[p].j;q=copt[col];s2.data[q].i=s1.data[q].j; s2.data[q].j=s1.data[q].i;s2.data[q].e=s1.data[q].e;++copt[col];l2.b[s2.data[q].i][s2.data[q].j]=s2.data[q].e;}printf(" 转置后的数据是:\n");for(a1=1;a1<=s1.nu;a1++){ for(b1=1;b1<=s1.mu;b1++) {printf("%10.3f",l2.b[a1][b1]);printf("\t");}printf("\n");printf(" ************************************");printf("\n");}}void jiafa(tsmatrix l4, tsmatrix l5)// 矩阵的加法{tsmatrix l6;for(int t=0; t<l4.i;t++) { for(int t1=0;t1<l4.j;t1++)l6.b[t][t1]=l4.b[t][t1]+l5.b[t][t1];} printf(" 矩阵加完后的结果:\n"); printf(" f**************************** **\n");for(int t2=0; t2<l4.i;t2++) { for(int t3=0;t3<l4.j;t3++){printf("%10.3f",l6.b[t2][t3]);printf("\t");}printf("\n");} for(int t2=0; t2<l4.i;t2++) { for(intt3=0;t3<l4.j;t3++)printf(" f**************************** **\n");}void jianfa(tsmatrix l4, tsmatrix l5)//矩阵的减法{tsmatrix l6;for(int t=0; t<l4.i;t++){ for(int t1=0;t1<l4.j;t1++)l6.b[t][t1]=l4.b[t][t1]-l5.b[t][t1];}printf(" 矩阵相减后的结果:\n");printf(" f**************************** **\n");void niyunsuan( tsmatrix s)// 矩阵的逆运算{printf("%10.3f",l6.b[t2][t3]);printf("\t");}printf("\n");}void chengfa(tsmatrix l4, tsmatrix l5)//{ tsmatrix l6; for(int t=0;t<l4.i;t++)for(int t1=0;t1<l5.j;t1++){ l6.b[t][t1]=0;for(int k=0;k<l4.j;k++)l6.b[t][t1]+=l4.b[t][k]*l5.b[k][t1];} printf(" 矩阵乘完后的结果 :\n");printf("******************************\n");for(int t2=0; t2<l4.i;t2++){ for(int t3=0;t3<l5.j;t3++){printf("%10.3f",l6.b[t2][t3]);printf("\t");}printf("\n");}printf("******************************\n");}{ tsmatrix s1;printf("f**************************** **\n"); 矩阵的乘法float t,x;int k,i,j;for(i=0;i<s.i;i++)for(j=0;j<(2*s.i);j++){ if(j<s.i) s1.b[i][j]=s.b[i][j];else if(j==s.i+i) s1.b[i][j]=1.0;else s1.b[i][j]=0.0;}for(i=0;i<s.i;i++){ for(k=0;k<s.i;k++){if(k!=i){ t=s1.b[k][i]/s1.b[i][i];for(j=0;j<(2*s.i);j++){ x=s1.b[i][j]*t;s1.b[k][j]=s1.b[k][j]-x;}}}}for(i=0;i<s.i;i++){ t=s1.b[i][i];for(j=0;j<(2*s.i);j++)s1.b[i][j]=s1.b[i][j]/t;}float y=1.0;for(i=0;i<s.i;i++) y=y*s1.b[i][i];if(y==0.0)printf(" 对不起,您输入的矩阵没有逆矩阵");else { for(i=0;i<s.i;i++)for(j=0;j<s.i;j++)s.b[i][j]=s1.b[i][j+s.i];printf(" 矩阵逆运算后的结果:\n");for(i=0;i<s.i;i++){ for(j=0;j<s.i;j++) printf("%10.3f",s.b[i][j]); printf("\n");}}}void main(){ tsmatrix l,l1,l3; sqlist s;int m,n,m1,n1,n4,n5,t,t1,t2,t3,t4,t5,t6,t7,t8;do{ printf(" 请输入你要进行的操作:\n");printf("******************************\n");3\n printf(" 矩阵转置运算请按1\n 矩阵的加法运算请按2\n 矩阵的乘法运算请按矩阵的减法运算请按4\n 矩阵的逆运算请按5\n 结束请按0:\n");printf("******************************\n");scanf("%d",&m1);if(m1==1){ printf(" 您选择进行的操作是矩阵的转置运算\n\n");printf(" 请输入你要转置矩阵的行数、列数和非零元的个数\n");scanf("%d",&t1);scanf("%d",&t2);scanf("%d",&t3);s.mu=t1;s.nu=t2;s.tu=t3;printf(" 请输入你要转置矩阵非零元的行下标、列下标(从[1][1] 开始由左至右由上到下) 及其数据(按行逐个输入)\n");for(t4=1;t4<=s.tu;t4++){scanf("%d",&t5);scanf("%d",&t6);s.data[t4].i=t5;s.data[t4].j=t6;scanf("%f",&s.data[t4].e);}for(t7=1;t7<=s.nu;t7++){ for(t8=1;t8<=s.mu;t8++)l1.b[t7][t8]=0.0;}zhuanzhi(s,l1);}if(m1==2){printf(" 您选择进行的操作是矩阵的加法运算\n\n");printf(" 请输入矩阵的行数和列数:\n");scanf("%d",&n);scanf("%d",&m);l.i=n;l.j=m;l3.i=n;l3.j=m;printf("******************************\n");printf("请输入第一个%d行%d列的矩阵\n",l.i,l.j); { for(t=0;t<l.i;t++)for(n1=0;n1<l.j;n1++)scanf("%f",&l.b[t][n1]);}printf("******************************\n");printf("******************************\n");printf("请输入第二个%d行%d列的矩阵\n",l3.i,l3.j);for(n4=0;n4<l3.i;n4++){ for(n5=0;n5<l3.j;n5++)scanf("%f",&l3.b[n4][n5]);}printf(" f**************************** **\n");jiafa(l,l3);}if(m1==3){阵的行数方可进行计算)\n\n");printf(" 请输入第一个矩阵的行数和列数:\n"); scanf("%d",&n);scanf("%d",&m);l.i=n;l.j=m;printf(" f**************************** **\n");printf("请输入第一个%d行%d列的矩阵\n",l.i,l.j);{ for(t=0;t<l.i;t++)for(n1=0;n1<l.j;n1++)scanf("%f",&l.b[t][n1]);printf("******************************\n");printf("******************************\n");printf(" 请输入第二个矩阵的行数和列数:\n");scanf("%d",&n1);scanf("%d",&m1);l3.i=n1;l3.j=m1;printf("******************************\n");printf("请输入第二个%d行%d列的矩阵\n",l3.i,l3.j);for(n4=0;n4<l3.i;n4++){ for(n5=0;n5<l3.j;n5++)scanf("%f",&l3.b[n4][n5]);}printf(" f**************************** **\n");chengfa(l,l3);}if(m1==4){printf(" 您选择进行的操作是矩阵的减法运算\n\n");printf(" 请输入矩阵的行数和列数:\n");scanf("%d",&n); scanf("%d",&m); l.i=n;l.j=m;l3.i=n;l3.j=m;printf("******************************\n");printf("请输入第一个%d行%d列的矩阵\n",l.i,l.j);{ for(t=0;t<l.i;t++)for(n1=0;n1<l.j;n1++)scanf("%f",&l.b[t][n1]);printf("******************************\n");printf("******************************\n");printf("请输入第二个%d行%d列的矩阵\n",l3.i,l3.j);for(n4=0;n4<l3.i;n4++){ for(n5=0;n5<l3.j;n5++)scanf("%f",&l3.b[n4][n5]);}printf("******************************\n");jianfa(l,l3);if(m1==5){printf(" 您选择进行的操作是矩阵的逆运算\n\n");printf(" 请输入矩阵的维数(即行和列相等的矩阵):\n");scanf("%d",&n);l.i=n;l.j=n;printf("******************************\n");printf("请输入%d 行%d 列的矩阵\n",l.i,l.j);{ for(t=0;t<l.i;t++)for(n1=0;n1<l.j;n1++)scanf("%f",&l.b[t][n1]);}printf("******************************\n");niyunsuan(l);}}while(m1!=0);(3)、矩阵的加法运算:層选择进行的操忙是矩阵的转置运覧 [青输入你要转置柜阵的行数、列数和非零元的个数 请BA 你蠻荐置矩阳E 零元的彳rr 标、列下标t 从⑴⑴开始庄左至右由上到F 戍其数据t 按个磕X? 1 2 32转置后的数据是:幕K KKICK 3CX 梵耳插M NWNMT 梵比寰注共基寰廉8(0,000 0.000 32.000 0.0002、 运行结果(如下图): (1)、执行的首界面: 〔7回丨厉I‘■J SJ faJHIfaJial ■ iaihJ ,hi 2, Ldh ■也 • W 參竞结闵\炖匚noEoE Visjal $tudio\Co m mor\M^D ev^8\B i n\Ce bug\5fd.eie r 歿直运算请按1柄加法运鼻请:[ 髒養蹩堡 屮址运第请抉 (2)、矩阵的转置运算: ■ G '啟拒结甘."vlicro Ec/ft 7 su a I Stud i o' Cc mmonVM 5D ev^B\ Bin\te bug-sfd .e>e' 口1卄1 2 34栗卄丄按按擾 -W 浚士早冃土冃安 L 丁 E 主養昱霍 进*算运运运“畀 要"运袪注迭运0: 尔卄置加乘诚逆按 丿卄書的的的请艮进讦的操作;■ * ttuid IC\C D m rron\M De-/^ £\G i n\De bug d. exe"请输入第一个钉代列的矩阵2您送择诜行的輾作是矩阵的加法运算请输入矩陆的行数和列数:请输入笫二个2行北列的矩阵1 3(4)、矩阵的减法运算:F青土<戶怖mh圭冃JuJ_lrtJI请输人矩眩的行数和列熱请艳入第一个刘亍2列的矩库1 21 2阵相减后的结果;-1.000-1.000请输入第二个羽冠列的楚阵1 3!=□' 3:1 数気结吃\|V i crosoft Visual ^tudio\Canrmor;M i D BV9&'.BinVCebug\wtd.exe'*MMw234卄按请请请按卄请*MX请卄算运运运*卄运法S法运B:z辭的的的请HHEEELUJ士匸”(5)、矩阵的乘法(7)、矩阵可以循环运算:二 2 3 4 -1615 一一按请请请按=请 ……算运运运算 一运法法袪运B: …奮的的的请卄X 二疆薯餐粵歩阵的;亍数方可进行计算〉青输入第一个矩阵的行数和列救: 请输入第一个彭刃列的矩阵 12 3 £34 MK HK NK MK MK MM XK M-M M MX MM HM MM HM M~K MT肾備*t ■・!廉釜・從科■科■・・K■ ■■ M Miift 甘禅f t请输入第二个矩陈的右数和列姝 (6)、矩阵的逆运算: SS t e f f i - ■ I -f 、I F ^-_n 请亶 一舁运运L g 畀运」法法法一疋0; 置 t a l s f e 临的的请5 冃至冃宀夏 您选择邀亍的操作是矩阵的世运算 请输入矩阵的维数唧行和列相等的矩阻:肯输尔劳讲fT 的唤l.WO -1.560 -3.960 1.WU -2-060 2.see -i.wu 请输人怖3列比矩萍 1 2 d2 2 11 4 3 'G '裁笔塔陀\M crosoft Visual &tud ic \Corrmon\M£De\,Q£^lEin'^Debuq 1'exc" 丄書F 按请请语按M 运运左B 阵隆区算E 的給里: U 虏r 柠青土 IL青按 41^1 '_1 - 1 J J J 诰异專异诗 M 运运运算 B 秤書 需的的的诘六、指导老师评语及成绩。