2023年数据结构课程设计报告n维矩阵乘法.docx

上传人:M****1 文档编号:545072218 上传时间:2023-04-28 格式:DOCX 页数:14 大小:19.68KB
返回 下载 相关 举报
2023年数据结构课程设计报告n维矩阵乘法.docx_第1页
第1页 / 共14页
2023年数据结构课程设计报告n维矩阵乘法.docx_第2页
第2页 / 共14页
2023年数据结构课程设计报告n维矩阵乘法.docx_第3页
第3页 / 共14页
2023年数据结构课程设计报告n维矩阵乘法.docx_第4页
第4页 / 共14页
2023年数据结构课程设计报告n维矩阵乘法.docx_第5页
第5页 / 共14页
点击查看更多>>
资源描述

《2023年数据结构课程设计报告n维矩阵乘法.docx》由会员分享,可在线阅读,更多相关《2023年数据结构课程设计报告n维矩阵乘法.docx(14页珍藏版)》请在金锄头文库上搜索。

1、数据结构课程设计报告n维矩阵乘法 数据结构 课程设计报告 设计题目: n维矩阵乘法:A B1 专 业 计算机科学与技术 班 级 计本 学 生 学 号 指导教师 起止时间 2022.X.3-2022.X.11 学年第 I 学期 一、 具体任务 功能: 设计一个矩阵相乘的程序,首先从键盘输入两个矩阵a,b的内容,并输出两个矩阵,输出ab1结果。 分步实施: 1.初步完成总体设计,搭好框架,确定人机对话的界面,确定函数个数; 2.完成最低要求:建立一个文件,可完成2维矩阵的情况; 3.进一步要求:通过键盘输入维数n。有兴趣的同学可以自己扩充系统功能。 要求: 1.界面友好,函数功能要划分好 2.总体

2、设计应画一流程图 3.程序要加必要的注释 4.要提供程序测试方案 5.程序一定要经得起测试,宁可功能少一些,也要能运行起来,不能运行的程序是没有价值的。 二、 软件环境 Microsoft Visual C+ 6.0 三、 问题的需求分析 程序以二维数组作为矩阵的存储结构,通过键盘输入矩阵维数n,动态分配内存空间,创建n维矩阵。矩阵建立后再通过键盘输入矩阵的各个元素值;也可以通过文件读入矩阵的各项数据(维数及各元素值)。 当要对矩阵作进一步操作(A*B或A*B(-1))时,先判断内存中是否已经有相关的数据存在,若还未有数据存在则提示用户先输入相关数据。 当要对矩阵进行求逆时,先利用矩阵可逆的充

3、要条件:|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)gt;| 1 = i = n , 1 = j = n-1 Col = a(i,j),a(i+1,j)gt;| 1 = i = n-1 , 1 = j = n 基本操作

4、: Swap(amp;a,amp;b); 初始条件:记录a,b已存在。 操作结果:交换记录a,b的值。 CreateMatrix(n); 操作结果:创建n维矩阵,返回该矩阵。 Input(amp;M); 初始条件:矩阵M已存在。 操作结果:从终端读入矩阵M的各个元素值。 Print(amp;M) 初始条件:矩阵M已存在。 操作结果:在终端显示矩阵M的各个元素值。 ReadFromFile(); 操作结果:从文件读入矩阵的相关数据。 Menu_Select(); 操作结果:返回菜单选项。 MultMatrix(amp;M1,amp;M2,amp;R); 初始条件:矩阵M1,M2,R已存在。 操作

5、结果:矩阵M1,M2作乘法运算,结果放在R中。 DinV(amp;M,amp;V); 初始条件:矩阵M,V已存在。 操作结果:求矩阵M的逆矩阵,结果放入矩阵V中。 MatrixDeterm(amp;M,n); 初始条件:矩阵M已存在。 操作结果:求矩阵M的行列式的值。 ADT MatrixMulti 2矩阵求逆算法设计思想 算法采用高斯-约旦法(全选主元)求逆,主要思想如下: 首先,对于k从0到n-1作如下几步: 从第k行、第k列开始的右下角子阵中选取绝对值最大的元素,并记住此元素所在的行号与列号,再通过行交换和列交换将它交换到主元素位置上。这一步称为全选主元。 主元求倒:M(k,k) = 1

6、 / M(k,k) M(k,j) = M(k,j) * M(k,k);j = 0,1,n-1;j != k M(i,j) = M(i,j) M(i,k) * M(k,j);i,j = 0,1,n-1;i,j!=k M(i,k) = - M(i,k) * M(k,k),i = 0,1,n-1;i != k 最后,根据在全选主元过程中所记录的行、列交换的信息进行恢复,恢复原则如下: 在全选主元过程中,先交换的行(列)后进行恢复;原来的行(列)交换用列(行)交换来恢复。 3.矩阵行列式求值运算算法设计思想 利用行列式的性质:行列式等于它的任一行(列)各元素与其对应的代数余子式乘积,即 D = a(i

7、,k)*A(i,k) ; k = 1,2,n; D = a(k,j)*A(k,j) ; k = 1,2,n; 再利用函数的递归调用法实现求其值。 4各函数间的调用关系 Main() ReadFromFile() DinV() Swap () Print() Menu_Select() MatrixDeterm() CreateMatrix() MultMatrix() Input() 5.流程图 否 否 是 否 是 是 否 是 否 否 是 开始 switch(Menu_Select() case 1: case 3: case 2: n gt; 0 ? 是 输入矩阵维数n 输入矩阵A,B 输出

8、矩阵维数n system(“pause”); 通过键盘输入需对哪个矩阵求逆,求出相应该的逆阵,并显示求得的逆阵system(“pause”);若矩阵不可逆则返回主菜单 case 4: R=A*B并显示矩阵R system(“pause”); case 5: 是 否 是 R=A*B(-1)显示矩阵R system(“pause”);若B不可逆,则返回主菜单 case 6: 从指定文件中读入矩阵数据 case 0: exit(0); 结果 否 五、 源代码 #include conio.hgt; #include stdio.hgt; #include stdlib.hgt; #include m

9、ath.hgt; #include malloc.hgt; #include string.hgt; #define YES 1 #define NO 0 typedef float ElemType; ElemType xxxA; /矩阵A ElemType xxxB; /矩阵B ElemType xxxR; /矩阵R,用于存放运算结果 ElemType xxxV; /矩阵V,存放逆矩阵 int n=0; /矩阵维数 int flag=-1; /标记 void swap(ElemType *a,ElemType *b) /交换记录a,b的值 ElemType c; c=*a; *a=*b;

10、*b=c; ElemType xxxCreateMatrix(int n) /创建n维矩阵,返回该矩阵 int i,j; ElemType xxxM; M = (ElemType xxx)malloc(sizeof(ElemType *)*n); if(M = NULL) exit(1); for(i=0;in;i+) *(M+i) = (ElemType *)malloc(sizeof(ElemType)*n); for(j=0;jn;j+) *(*(M+i)+j) = 0; return M; ElemType MatrixDeterm(ElemType xxxM,int n) /*递归法

11、求n维矩阵行列式的值,返回运算结果*/ int i,j,k,l,s; ElemType xxxT1; ElemType xxxT2; T1=CreateMatrix(n); T2=CreateMatrix(n); ElemType u; ElemType value=0; /运算结果 for(i=0;in;i+) for(j=0;jn;j+) T1ij=Mij; T2ij=Mij; if(n=2) /若为2维矩阵,则直接运算并返回运算结果 value=T200*T211-T201*T210; return value; else for(j=0;jn;j+) /将矩阵的行列式以第一行展开 u=

12、T10j; for(i=1,l=0;in;i+) /求矩阵行列式的余子式M(0,j) for(k=0,s=0;kn;k+) if(k=j) continue; else T2ls=T1ik; s+; l+; value=value+u*(int)pow(-1,j)*MatrixDeterm(T2,n-1); /*行列式等于某一行的各个元素与其代数余子式的乘积之和*/ return value; int DinV(ElemType xxxM,ElemType xxxV) /*全选主元法求矩阵M的逆矩阵,结果存入矩阵V中*/ int i,j,k; ElemType d; ElemType u; int *JS,*IS; JS=(int *)malloc(sizeof(int)*n); IS=(int *)malloc(sizeof(int)*n); u=MatrixDeterm(M,n); /返回矩阵A的行列式值 if(u=0) return -1; for(i=0;in;i+) for(j=0;jn;j+) Vij=Mij; for(k=0;kn;k+) d=0; for(i=k;in;i+) /找出矩阵M从Mkk开始绝对值最大的元素 for(j=k;jn;j+) if(fabs(Vij)gt;d) d=fabs(Vi

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 商业/管理/HR > 人事档案/员工关系

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号