数据结构课程设计 特殊矩阵运算
数据结构课程设计-特殊矩阵计算器

特殊矩阵计算器1、特殊矩阵计算器问题描述:创建两个特殊矩阵 A 和 B,计算 A+B、A-B、A*B、B*A、A(或 B)的逆、A(或 B)的转置、A(或 B)的行列式等,具体要求如下:① A、B 均是压缩存储的特殊矩阵,如上/下三角矩阵、对称矩阵、对角矩阵、单位矩阵等。
② A、B 的矩阵类型、行列数、各位置的元素值等信息均在运行时指定(对于不同类型的矩阵,要求输入的数据也不尽相同)。
③各运算若可行,则打印结果;若不可行,则给出提示信息。
④各运算需自己实现,禁止调用语言内建或第三方类库的矩阵 API。
涉及算法及知识:特殊矩阵的压缩存储、矩阵相关运算。
#include<>#include<>#define max 100typedef struct{int row,col;//定义矩阵行数、列数int a[max][max];}Matrix; //存储结构typedef struct{int array[max];int n; //定义矩阵的阶}M;Matrix A,B,C,D;M p;//*************矩阵的压缩存储*********************//int CompressMatrix(int m,int i,int j,int n){int k;if(m==1){if(i<=j)k=(2*n-i+1)*i/2+(j-i)+1;elsek=0;return k;}if(m==2){if(i>=j)k=i*(i+1)/2+j+1;elsek=0;return k;}if(m==3){if(i>=j)k=i*(i+1)/2+j;elsek=j*(j+1)/2+i;return k;}if(m==4){if(i!=j)k=0;elsek=i+1;return k;}if(m==5){if(i==j)return 1;elsereturn 0;}return 0;}//*************矩阵定义*********************////上三角矩阵 //void CreateMatrixUppertri(M &a,Matrix &A){int i,j,t,n;printf("请输入上三角矩阵的行数和列数(行数与列数相同):");scanf("%d%d",&,&;n=;=n;printf("请输入%d个数:",n*(n+1)/2);[0]=0;for(i=1;i<=n*(n+1)/2;i++)scanf("%d",&[i]);for(i=0;i<n;i++)for(j=0;j<n;j++){t=CompressMatrix(1,i,j,n);[i][j]=[t];}}//下三角矩阵void CreateMatrixLowertri(M &a,Matrix &A){int i,j,t,n;printf("请输入下三角矩阵的行数和列数(行数与列数相同):");scanf("%d%d",&,&;n=;=n;printf("请输入%d个数:",n*(n+1)/2);[0]=0;for(i=1;i<=n*(n+1)/2;i++)scanf("%d",&[i]);for(i=0;i<n;i++)for(j=0;j<n;j++){t=CompressMatrix(2,i,j,n);[i][j]=[t];}}//对称矩阵void CreateMatrixSymmetry(M &a,Matrix &A){int i,j,t,n;printf("请输入对称矩阵的行数和列数(行数与列数相同):");scanf("%d%d",&,&;n=;=n;printf("请输入%d个数:",n*(n+1)/2);for(i=0;i<n*(n+1)/2;i++)scanf("%d",&[i]);for(i=0;i<n;i++)for(j=0;j<n;j++){t=CompressMatrix(3,i,j,n);[i][j]=[t];}}//对角矩阵void CreateMatrixDiagonal(M &a,Matrix &A){int i,j,t,n;printf("请输入对角矩阵的行数和列数(行数与列数相同):");scanf("%d%d",&,&;n=;=n;printf("请输入%d个数:",n);[0]=0;for(i=1;i<=n;i++)scanf("%d",&[i]);for(i=0;i<n;i++)for(j=0;j<n;j++){t=CompressMatrix(4,i,j,n);[i][j]=[t];}}//单位矩阵void CreateMatrixUnit(M &a,Matrix &A){int i,j,t,n;printf("请输入单位矩阵的行数和列数(行数与列数相同):");scanf("%d%d",&,&;n=;=n;[0]=0;[1]=1;for(i=0;i<n;i++)for(j=0;j<n;j++){t=CompressMatrix(5,i,j,n);[i][j]=[t];}}//*************矩阵运算*********************////矩阵加法int Add(Matrix A,Matrix B,Matrix &C){int i,j;if!=return 0;else{=;=;for(i=0;i<;i++)for(j=0;j<;j++)[i][j]=[i][j]+[i][j];}return 1;}//矩阵减法int Sub(Matrix A,Matrix B,Matrix &C) {int i,j;if!=return 0;else{=;=;for(i=0;i<;i++)for(j=0;j<;j++)[i][j]=[i][j][i][j];}return 1;}//矩阵乘法int Mul(Matrix A,Matrix B,Matrix &C){int i,j,k;if!=return 0;else{=;=;for(i=0;i<;i++)for(j=0;j<;j++)[i][j]=0;for(i=0;i<;i++) //A的行数for(j=0;j<;j++) //A的列数和B的行数for(k=0;k<;k++) //B的列数[i][j]+=[i][k]*[k][j];}return 1;}//矩阵的逆运算void Inverse(Matrix A){Matrix C;float p,q;int k,i,j,n;n=;for(i=0;i<n ;i++)for(j=0;j<(n *2);j++){if(j<n)[i][j]= [i][j];else if(j==n+i)[i][j]=;else[i][j]=;}for(k=0;k<n ;k++){for(i=0;i<n ;i++){if(i!=k){p= [i][k]/ [i][i];for(j=0;j<(n *2);j++){q= [i][j]*p;[i][j]= [i][j]-q;}}}}for(i=0;i<n ;i++){p=[i][i];for(j=0;j<n*2;j++)[i][j]=[i][j]/p;float y=;for(i=0;i<n;i++)y=y*[i][i];for(i=0;i<n;i++)for(j=0;j<n;j++)[i][j]=[i][j+n];printf("逆运算结果:\n");for(i=0;i<n;i++){for(j=0;j<n;j++)printf("%d ",[i][j]);printf("\n");}}}//矩阵转置void Tans(Matrix A,Matrix &C){int i,j;=;=;for(i=0;i<;i++)for(j=0;j<;j++)[j][i]=[i][j];}//矩阵行列式的值void Determinant(Matrix A) { int count[100];int sum=0;int n;n=; //矩阵的阶nfor (int p = 0; p < n; p++) {int k = 0; int j = p%n;count[p]= [k][p];for (int i = 1; i < n; i++) {k++; j++;k = k%n;j = j%n;count[p] *= [k][j];}}for (p = n-1; p >=0; p--) {int k = 0; int j = p%n;count[2*n-1-p] = [k][p];for (int i = 1; i < n; i++) {k++; j--;k = (k+n)%n;j =(j+n)%n;count[2*n-1-p] *= [k][j];}}for (int i = 0; i < n; i++)sum+= (count[i]-count[i + n]);printf(" %d\n",sum);}//输出函数void print(Matrix A){int i,j;for(i=0;i<;i++){for(j=0;j<;j++)printf(" %d ",[i][j]);printf("\n");}}//菜单函数void showMenu(){printf("特殊矩阵计算器\n");printf("选项1:上三角矩阵\n");printf("选项2:下三角矩阵\n");printf("选项3:对称矩阵\n");printf("选项4:对角矩阵\n");printf("选项5:单位矩阵\n");}void showMenu2(){printf("输入选项得到结果后,如果想继续选择,请输入“Y”,否则输入任意字符退出:\n");printf("选项1:矩阵相加\n");printf("选项2:矩阵相减\n");printf("选项3:矩阵相乘\n");printf("选项4:矩阵的逆矩阵\n");printf("选项5:矩阵转置\n");printf("选项6:矩阵行列式\n");}//主函数int main(){char ifcontinue;int x;int y;showMenu();//输出矩阵Aprintf("矩阵A类型为(输入数字选择):");scanf("%d",&x);if(x==1){CreateMatrixUppertri(p,A);printf("输出上三角矩阵A:\n");print(A);}if(x==2){CreateMatrixLowertri(p,A);printf("输出下三角矩阵A:\n");print(A);}{CreateMatrixSymmetry(p,A);printf("输出对称矩阵A:\n");print(A);}if(x==4){CreateMatrixDiagonal(p,A);printf("输出对角矩阵A:\n");print(A);}if(x==5){CreateMatrixUnit(p,A);printf("输出单位矩阵A:\n");print(A);}//输出矩阵Bprintf("矩阵B类型为(输入数字选择):");scanf("%d",&x);if(x==1){CreateMatrixUppertri(p,B);printf("输出上三角矩阵B:\n");print(B);}{CreateMatrixLowertri(p,B);printf("输出下三角矩阵B:\n");print(B);}if(x==3){CreateMatrixSymmetry(p,B);printf("输出对称矩阵B:\n");print(B);}if(x==4){CreateMatrixDiagonal(p,B);printf("输出对角矩阵B:\n");print(B);}if(x==5){CreateMatrixUnit(p,B);printf("输出单位矩阵B:\n");print(B);}//选择矩阵运算showMenu2();while(1){printf("请选择运算方式(输入数字选择):\n");scanf("%d",&y);switch(y){case 1:if(Add(A,B,C))print(C);elseprintf("运算错误\n");printf("**********************************\n");break;case 2:if(Sub(A,B,C))print(C);elseprintf("运算错误\n");printf("**********************************\n");break;case 3:if(Mul(A,B,C))print(C);elseprintf("运算错误\n");printf("----------------------------------\n");if(Mul(B,A,C))print(C);elseprintf("运算错误\n");printf("**********************************\n");break;case 4:Inverse(A);printf("----------------------------------\n");Inverse(B);printf("**********************************\n");break;case 5:Tans(A,C);print(C);printf("----------------------------------\n");Tans(B,C);print(C);printf("**********************************\n");break;case 6:Determinant(A);printf("----------------------------------\n");Determinant(B);printf("**********************************\n");break;default:printf("请输入正确的选项!\n");printf("**********************************\n");}getchar();ifcontinue= getchar();if(ifcontinue!='Y')break;}return 0;}。
矩阵的加法运算问题-数据结构与算法课程设计报告

合肥学院计算机科学与技术系课程设计报告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、主界面设计:为了实现对稀疏矩阵的多种算法功能的管理,首先设计一个含有多个菜单项的主控菜单子程序以链接系统的各项子功能,方便用户交互式使用本系统。
数据结构课程设计报告---矩阵的运算

数据结构课程设计报告题目:专业:班级:学号:姓名:指导老师:时间:一、课程设计题目及所涉及知识点设计题目是“矩阵的运算”;所涉及的知识点主要是: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 课程设计 矩阵加减乘一、课程目标知识目标:1. 理解矩阵加减乘的基本概念和运算法则。
2. 掌握矩阵加减乘的计算步骤,能够准确进行相关运算。
3. 了解矩阵加减乘在实际问题中的应用。
技能目标:1. 能够正确运用矩阵加减乘的法则,解决相关问题。
2. 能够通过矩阵加减乘的计算,提高数学逻辑思维能力和问题解决能力。
3. 能够运用矩阵加减乘的知识,解决一些简单的实际问题。
情感态度价值观目标:1. 培养学生对矩阵加减乘学习的兴趣,激发学生的求知欲。
2. 培养学生团队协作精神,提高学生在小组讨论中的沟通能力。
3. 培养学生严谨、细心的学习态度,养成良好的数学素养。
课程性质:本课程为数学课程,以矩阵加减乘为基础,培养学生的数学运算能力和实际问题解决能力。
学生特点:学生为初中生,具备一定的数学基础,对新鲜事物充满好奇心,但注意力容易分散。
教学要求:结合学生特点,注重启发式教学,引导学生主动参与课堂讨论,提高学生的实际操作能力。
同时,关注学生的情感态度,激发学生的学习兴趣。
通过本课程的学习,使学生在知识、技能和情感态度价值观方面均取得具体的学习成果。
二、教学内容1. 矩阵的基本概念:介绍矩阵的定义、元素、行列数等基本概念,使学生理解矩阵的结构和特点。
- 教材章节:第一章 矩阵与线性方程组,第1节 矩阵的基本概念2. 矩阵的加减法:讲解矩阵加减法的规则,通过实例演示运算过程,让学生掌握矩阵加减法的运算方法。
- 教材章节:第一章 矩阵与线性方程组,第2节 矩阵的运算,1. 矩阵的加减法3. 矩阵的乘法:介绍矩阵乘法的法则,通过实际例题,让学生熟练运用矩阵乘法解决问题。
- 教材章节:第一章 矩阵与线性方程组,第2节 矩阵的运算,2. 矩阵的乘法4. 矩阵的应用:分析矩阵在实际问题中的应用,如线性方程组、图像处理等领域,提高学生的实际问题解决能力。
- 教材章节:第一章 矩阵与线性方程组,第3节 矩阵的应用5. 课堂练习与讨论:针对教学内容,设计不同难度的练习题,让学生在课堂上进行实际操作,加强知识点的巩固。
数据结构矩阵相关操作的课程设计

课程设计题目矩阵乘法教学院计算机学院专业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 课程设计矩阵运算一、教学目标本节课的教学目标是让学生掌握矩阵的基本运算,包括矩阵的加法、减法、数乘以及矩阵的乘法。
通过学习,学生应能理解矩阵运算的定义和规则,并能运用这些运算解决实际问题。
此外,学生还应掌握矩阵运算的数学原理,提高逻辑思维和数学运算能力。
在情感态度价值观方面,学生应培养对数学学科的兴趣,增强自信心,培养团队合作精神。
二、教学内容本节课的教学内容主要包括矩阵的基本运算和数学原理。
首先,介绍矩阵的加法、减法、数乘和矩阵的乘法,通过举例说明这些运算的定义和规则。
然后,讲解矩阵运算的数学原理,包括线性方程组的解法、行列式的计算以及矩阵的逆矩阵。
最后,通过实际案例让学生运用矩阵运算解决实际问题,提高学生的应用能力。
三、教学方法为了激发学生的学习兴趣和主动性,本节课将采用多种教学方法。
首先,采用讲授法,清晰地讲解矩阵运算的定义和规则,以及数学原理。
其次,采用讨论法,让学生分组讨论矩阵运算的应用案例,培养学生的思考和表达能力。
此外,还采用案例分析法,让学生分析实际问题,运用矩阵运算解决问题。
最后,通过实验法,让学生动手实践,加深对矩阵运算的理解。
四、教学资源为了支持教学内容和教学方法的实施,本节课将准备以下教学资源。
首先,教材和相关参考书,为学生提供系统的学习资料。
其次,多媒体资料,如PPT、教学视频等,用于直观地展示矩阵运算的过程和应用案例。
此外,还将提供实验设备,如计算器、电脑等,让学生进行实际操作,提高实践能力。
通过丰富多样的教学资源,丰富学生的学习体验,提高学习效果。
五、教学评估本节课的教学评估将采用多元化的评估方式,以全面、客观地评价学生的学习成果。
评估方式包括平时表现、作业、考试等。
平时表现主要评估学生的课堂参与度、提问回答等,通过观察学生的表现来了解他们的学习状态。
作业方面,将布置适量的练习题,要求学生在规定时间内完成,通过批改作业了解学生对矩阵运算的理解和掌握程度。
考试方面,将设置期中考试和期末考试,考试内容涵盖本节课的全部知识点,通过考试来检验学生的学习成果。
数据结构课程设计(矩阵的运算)

数据结构课程设计报告题目:_____________________________________专业:_____________________________________班级:_____________________________________学号:_____________________________________姓名:_____________________________________指导老师:__________________________________时间:_____________________________________、课程设计题目及所涉及知识点设计题目是“矩阵的运算” ,所涉及的知识点主要是:1、数据结构中的对于结构体的定义,用typedef struct 来实现,根据所设计的问题在结构体里面定义数据类型及其变量,用define 定义数组的大小,然后利用typedef 来实现对于变量的未知类型确定正确的类型。
2、利用数组的形式来储存数据,在实现不同操作过程中,有的用一维结构体数组(三元组顺序表)来存储,有的用二维数组来储存。
3、转置的过程中利用的是快速转置的方法,附设了num 和cpot 两个辅助变量。
4、矩阵的加法、减法、乘法、逆运算的基本算法方式。
5、通过调用每个函数,来实现每个算法的功能。
、课程设计思路及算法描述设计思路:1、首先是对于转置的考虑,要运用快速转置的方法实现,必须用三元组顺序表来储存数据,所以在第一个结构体中存在int 类型的行数(mu )列数(nu )以及非零元素的个数(tu );然后第二个结构体中分别有非零元素的行下标(i)、列下标(j)和元素数值(e),最后在第一个结构体中实现对第二个结构体成为数组结构体类型。
2、对于其余加法、减法、乘法和逆运算则是运用另一个结构体来实现,里面只有矩阵的行数、列数和一个二维数组(用float 来定义类型)。
实验5 特殊矩阵的存储和运算

实验报告五特殊矩阵与广义表的存储与运算班级: 姓名: 学号: 专业:一、实验目的:1、了解多维数组的存储方式与存取特点2、熟悉稀疏矩阵的存储方式3、用三元组法实现稀疏矩阵的相、减、转置算法。
二、实验内容:1、在矩阵类Matrix中,增加下列操作:1)判断一个矩阵就是否为上(下)三角矩阵、对称矩阵。
2)判断两个矩阵就是否相等。
3)计算两个矩阵的乘积。
算法原代码:public class Matrix {private int[][] matrix;private int row;private int column;public Matrix(int[][] matrix){row = matrix、length;column = matrix[0]、length;this、matrix = new int[row][column];for(int i=0;i<matrix、length;i++){for(int j=0;j<matrix[i]、length;j++){this、matrix[i][j] = matrix[i][j];}}}public Matrix(int row, int column){this、row = row;this、column = column;matrix = new int[row][column];}/*** 判断上三角* @param matrix* @return*/public static boolean isUpTri(Matrix matrix){if(matrix、column!=matrix、row){throw new IllegalArgumentException("矩阵的行列不相等"); }for(int i=0;i<matrix、getRow();i++){for(int j=i+1;j<matrix、getColumn();j++){if(0 == matrix、getElement(i, j)){return false;}}}return true;}/*** 判断下三角* @param matrix* @return*/public static boolean isDownTri(Matrix matrix){//先判断行列相不相等if(matrix、column!=matrix、row){throw new IllegalArgumentException("矩阵的行列不相等"); }for(int j=0;j<matrix、getColumn();j++){for(int i=j+1;i<matrix、getColumn();i++){if(matrix、getElement(i,j)==0){return false;}}}return true;}/*** 判断matrix就是不就是对称矩阵* @param matrix* @return*/public static boolean isSymmetry(Matrix matrix){for(int i=0;i<matrix、getRow();i++){for(int j=i+1;j<matrix、getColumn();j++){if(matrix、getElement(i,j) != matrix、getElement(j,i)){return false;}}}return true;}/*** 判断两个矩阵就是否相等* @param matrix1* @param matrix2* @return*/public static boolean equals(Matrix matrix1, Matrix matrix2){ if(matrix1、getRow()!=matrix2、getRow()||matrix1、getColumn()!=matrix2、getColumn()){return false;}for(int i=0;i<matrix1、row;i++){for(int j=0;j<matrix1、column;j++){if(matrix1、getElement(i,j)!=matrix2、getElement(i,j)){return false;}}}return true;}/*** 将两个矩阵相乘* @param TemPMatrix* @return*/public Matrix multiply(Matrix TemPMatrix) {if(column!=TemPMatrix、row){throw new IllegalArgumentException("行列不匹配,两个矩阵无法相乘");}Matrix matrix1 = new Matrix(row,TemPMatrix、column);for(int i=0;i<matrix1、row;i++){for(int j=0;j<matrix1、column;j++){int sum = 0;for(int k=0;k<column;k++){sum += (this、matrix[i][k])*(TemPMatrix、getElement(k,j));}matrix1、setElement(i,j,sum);}}return matrix1;}/*** 两个矩阵相加* @param matrix* @return*/public Matrix plus(Matrix matrix){if(row!=matrix、getRow()&&column!=matrix、getColumn()){ throw new IllegalArgumentException("行列不匹配");}int[][] tempMatrix = new int[row][column];for(int i=0;i<row;i++){for(int j=0;j<column;j++){tempMatrix[i][j] = this、matrix[i][j]+ matrix、getElement(i,j);}}return new Matrix(tempMatrix);}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o、getClass()) return false; Matrix matrix1 = (Matrix) o;if (row != matrix1、row) return false;if (column != matrix1、column) return false;return Arrays、deepEquals(matrix, matrix1、matrix);}public void setElement(int row, int column, int element){ matrix[row][column] = element;}public int getElement(int row, int column){return matrix[row][column];}public int getRow() {return row;}public int getColumn() {return column;}@Overridepublic String toString() {String string = new String();for(int i=0;i<row;i++){for(int j=0;j<column;j++){string += matrix[i][j]+" ";}string += "\n";}return string;}}public class Test {public static void main(String[] args) throws Exception {Matrix matrix1 = new Matrix(newint[][]{{1,0,0,0,0},{1,2,0,0,0},{1,2,3,0,0},{1,2,3,4,0},{1,2,3,4,5}} );Matrix matrix2 = new Matrix(newint[][]{{1,2,3,4,5},{0,2,3,4,5},{0,0,3,4,5},{0,0,0,4,5},{0,0,0,0,5}} );Matrix matrix3 = new Matrix(newint[][]{{1,2,3,4,5},{2,1,6,7,8},{3,6,1,9,10},{4,7,9,1,11},{5,8,10,11 ,1}});Matrix matrix4 = new Matrix(newint[][]{{1,0,0,0,0},{1,2,0,0,0},{1,2,3,0,0},{1,2,3,4,0},{1,2,3,4,5}} );System、out、println(matrix1);System、out、println(matrix2);System、out、println("matrix1就是否就是上三角:"+Matrix、isUpTri(matrix1));System、out、println("matrix2就是否就是上三角:"+Matrix、isUpTri(matrix2));System、out、println("matrix1就是否就是下三角:"+Matrix、isDownTri(matrix1));System、out、println("matrix2就是否就是下三角:"+Matrix、isDownTri(matrix2));System、out、println("matrix3就是否就是对称矩阵"+Matrix、isSymmetry(matrix3));System、out、println("matrix2就是否就是对称矩阵"+Matrix、isSymmetry(matrix2));System、out、println("matrix1就是否等于matrix2:"+matrix1、equals(matrix2));System、out、println("matrix1就是否等于matrix4:"+matrix1、equals(matrix4));System、out、println();System、out、println("matrix1*matrix2");System、out、println(matrix1、multiply(matrix2));}}测试结果如下:2、在三元组行的单链表表示的稀疏矩阵类LinkedMatrix中,增加判断矩阵相等、判断对称矩阵、计算矩阵乘积等操作。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
特殊矩阵运算1.1程序功能简介对特殊矩阵能够在界面上以人们熟悉的方式显示,可以对特殊矩阵进行加法运算和减法运算,矩阵转置。
按照要求使用了多种数据结构来求解问题,具体为二维数组和类似图的数据结构。
由于题目要求使用多种数据结构,因此分开写了两段程序,均实现了上述要求的功能,以下将分开说明。
先说明的是用二维数组实现的程序,后说明的是用图结构实现的程序。
1.2关于输入、输出形式及数据范围1.2.1使用二维数组实现的程序输入、输出范围为:-73786976294838206000到73786976294838206000,足以解决绝大多数的矩阵运算问题。
1.2.2输入的格式进入程序后首先展现的是功能选择界面,如下图:此时可通过输入对应功能的数字来选择功能。
在此程序中不同功能输入格式不同:选择功能 1.矩阵转置时需要输入要进行转置操作的矩阵,首先输入矩阵的行数和列数,以逗号隔开,之后依次按矩阵形式输入矩阵即可,各数值之间以空格隔开。
选择功能2.矩阵数乘时需要输入要进行数乘操作的矩阵,此输入格式同上,之后输入一个实数,即要进行数乘的数即可。
功能3.矩阵加法与4.矩阵减法输入格式和5.矩阵乘法相同,按上述操作输入两个矩阵即可,需要注意的是矩阵减法默认顺序为先输入的矩阵减去后输入的矩阵。
当按照格式输入时可以实现以上功能,但输入错误数据时,例如进行行列数不同的矩阵相加减时则会返回无法操作,请重新输入的提示。
具体情况见下文测试部分。
1.3.1使用图结构实现的稀疏矩阵运算器程序输入、输出范围同上。
1.3.2输入的格式进入程序后首先展现的是功能选择界面,如下图:选择功能部分输入同上。
在进行矩阵输入时采取三元组的形式,这是由于稀疏矩阵的多零元性质。
首先输入矩阵的行数、列数、非零元个数,以空格隔开,输入完毕后确认,开始输入各个非零元。
输入非零元时按“所在行下标所在列下标值”的形式输入,需要注意的是输入时只能从所在行小的开始按顺序输入,不能先输入行数大的数据再输入行数小的数据。
2 概要设计2.1用二维数组实现的程序的概要设计由于使用二维数组结构实现上述功能较为简单,故全部运算仅由主函数执行,不单写出各个简单的函数。
通过switch()实现对各个功能的选择。
具体如下:Switch(1):进入矩阵转置功能;Switch(2):进入矩阵数乘功能;Switch(3):进入矩阵加法功能;Switch(4):进入矩阵减法功能;Switch(5):进入矩阵乘法功能;Switch(6):结束本程序;各功能中的矩阵都是以二维数组的形式进行存储与运算的,使用完整的存储方式使矩阵运算在设计上更为便捷,而且面对更多不同运算时也不存在因结构限制而导致的功能缺失。
相应的,因为存储了完整矩阵,且运算时都是完整矩阵的每个元素都参与,所以运行相对较慢。
2.2用图结构实现的程序的概要设计本模块要求设计函数建立稀疏矩阵并初始化,使用三元组结构。
在创建稀疏矩阵时,需要设计三元组创建稀疏矩阵,在输入出现错误时,能够对错误进行判别处理,初始化稀疏矩阵都为空值。
在对稀疏矩阵进行初始化时,只输入非零元素的值和它所在的所在行及所在列。
在对稀疏矩阵输出时,以矩阵的完整形式输出。
本程序存储矩阵的形式是非零元与矩阵形状结合,更适应稀疏矩阵的性质,在存储空间和运算速度上都有较大优势,但在设计各个功能时较为复杂,控制矩阵在运算时的行列变换需要进行复杂的判断和双层for循环来赋零值或进行非零值的运算。
整体结构由主函数调用各个功能函数,条理清晰,具体如下:流程从运算器的图形界面输出开始,之后进行功能选择,此部分流程同上。
当选择功能1.矩阵加法时先调用矩阵创建函数Creat()输入矩阵A,调用输出矩阵函数Print_SMatrix(),再重复以上流程输入矩阵B,此时进行判断两矩阵能否相加,再调用矩阵加法函数AddSMatrix(A,B,C,n)进行矩阵加法运算输出结果矩阵C,结束后调用三次Destory_SMatrix()函数销毁矩阵A、B、C,最后返回流程开始处进行下一项任务。
功能2矩阵减法流程同功能1矩阵加法。
功能3矩阵转置只需输入矩阵A即可进行下一步调用矩阵转置函数TransposeSMatrix(),再输出转置后的矩阵B,销毁矩阵A、B后返回流程开始处进行下一项任务。
功能4用来结束程序,在选择功能4后调用break函数跳出switch结束程序。
3详细设计3.1二维数组结构的程序的详细设计算法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列的和。
这样就实现了A矩阵与B矩阵的加法运算。
算法如下:ar=br;ac=bc;for(i=0;i<ar;i++){for(j=0;j<ac;j++){C[i][j]=A[i][j]+B[i][j];}}算法4:矩阵的减法运算;首先是把将要运算的矩阵存放在数组中,矩阵的减法运算,就是要实现A矩阵与B矩阵进行减法运算。
事实上就是A矩阵的每一行ar与B矩阵的每一行br进行减法运算,而得到的一个新的矩阵C的每一行cr就是A矩阵的ar行与B矩阵的br行的差;A矩阵的每一列ac与B矩阵的每一列bc进行减法运算,而得到的一个新的矩阵C的每一列cc就是A矩阵的ac列与B矩阵的bc列的差。
这样就实现了A矩阵与B矩阵的减法运算。
算法如下:ar=br;ac=bc;for(i=0;i<ar;i++){for(j=0;j<ac;j++){C[i][j]=A[i][j]-B[i][j];}}算法5:矩阵的乘法运算;首先是把将要运算的矩阵存放在数组中,矩阵的乘法运算,就是要实现A 矩阵与B矩阵进行乘法运算。
只有当进行运算的A矩阵的列ac等于B矩阵的行br时,两个矩阵才能进行运算,而得到的结果C矩阵要等于A矩阵的行ar和B矩阵的列bc。
这样就实现了两个矩阵的乘法运算。
算法如下:cr=ar;cc=bc;for(i=0;i<ar;i++){for(j=0;j<bc;j++){for(k=0;k<ac;k++){C[i][j]+=A[i][k]*B[k][j];}}}3.2图结构的程序的详细设计3.2.1主界面的设计:定义两个矩阵:矩阵A= 1 2 3 矩阵B= 9 8 74 5 6 6 5 47 8 9 3 2 1定义两个数组A和B,用于存储矩阵a和矩阵b的值;定义一个数组C,用于存放数组A和数组B相加减后的结果。
3.2.2矩阵存储的实现方式:稀疏矩阵的存储比较浪费空间,所以我们可以定义两个数组A、B,采用压缩存储的方式来对上面的两个矩阵进行存储。
具体的方法是,将非零元素的值和它所在的行号、列号作为一个结点存放在一起,这就唯一确定一个非零元素的三元组(i、j、v),例如struct Triple。
将表示稀疏矩阵的非零元素的三元组按行优先的顺序排列,则得到一个其结点均为三元组的线性表rpos[x]。
即:以一维数组顺序存放非零元素的行号、列号和数值,行号-1作为结束标志。
例如,上面的矩阵a,利用数组A存储后内容为: A[0]=0,A[1]=2, A[2]=3, A[3]=1, A[4]=6, A[5]=5, A[6]=3, A[7]=4, A[8]=7, A[9]=5, A[10]=1, A[11]=9, A[12]=-1 。
同理,用数组B存储矩阵b的值。
3.2.3稀疏矩阵的加减法实现:主要算法结构分析:1)int CreateMatrix(int A[m][n],int B[50])这是一个将稀疏矩阵转存的函数,类似于顺序存储三元组表。
在这个方法中,只要用一个二重循环来判断每个矩阵元素是否为零,若不为零,则将其行、列下标及其值存入到一维数组B中对应的元素。
在定义函数的过程中,我们需要定义一个for循环,以完成行和列的转换及存储。
在函数的末尾我们定义一个B[K]=-1,用于结束非零元素的存储。
2)int MatrixAdd(int A[max],int B[max],int C[max])这个函数用于实现数组A和数组B的相加,并将其相加的结果存入数组C。
这个函数讨论了数组在相加的过程中的几种情况: a、A数组和B数组的行相等且列相等,两者直接相加后存入数组C中。
3)int SubSMatrix(int A[max],int B[max],int C[max])这个函数用于实现数组A和数组B的相减,并将其相减的结果存入数组C。
这个函数讨论了数组在相减的过程中的几种情况: a、A数组和B数组的行相等且列相等,两者直接相减后存入数组C中。
4)int TransposeSMatrix(TSMatrix *a,TSMatrix *b)此函数用于实现矩阵的转置,由于转置的本质是矩阵中每个元素的行、列下标互换,因此在做矩阵转置时矩阵B与矩阵A的行、列数和非零元个数都是相等的,只需把A矩阵中的元素在存入B矩阵的过程中将表示每个元素位置的行列数,即i、j互换存入即可得到转置矩阵B。
3.2.3模块结构图建立主调函数建立三元组表建立矩阵函数矩阵相加减矩阵转置输出稀疏矩阵的基本操作3.2.4流程图4.程序调试4.1二维数组程序的调试二维数组结构的矩阵运算程序比较好做,因此除了题目要求的加减法和转置外我还做了数乘和乘法功能,最终实现了更为完善的矩阵运算程序在做这个程序的过程中在算法方面并没有遇到难以解决的的问题,所使用的算法都是基础的数组操作和三层以下的循环。
花费功夫最多的是格式和界面的设计,这些设计也应用到了下一个以图结构为基础的矩阵运算器程序中。