首页 > 试题

矩阵维数

更新时间:2022-11-12 17:02:49 阅读: 评论:0

人教版电子课本官网-不同种类的英语


2022年11月12日发(作者:骨盆)

数据结构

课程设计报告

设计题目:n维矩阵乘法:AB-1

专业计算机科学与技术

班级计051本

学生林垂敏

学号29

指导教师潘崇

起止时间

2007-2008学年第I学期

一、具体任务

功能:

设计一个矩阵相乘的程序,首先从键盘输入两个矩阵a,b的内容,并

输出两个矩阵,输出ab-1结果。

分步实施:

1.初步完成总体设计,搭好框架,确定人机对话的界面,确定函数个数;

2.完成最低要求:建立一个文件,可完成2维矩阵的情况;

3.进一步要求:通过键盘输入维数n。有兴趣的同学可以自己扩充系统

功能。

要求:

1.界面友好,函数功能要划分好

2.总体设计应画一流程图

3.程序要加必要的注释

4.要提供程序测试方案

5.程序一定要经得起测试,宁可功能少一些,也要能运行起来,不能运

行的程序是没有价值的。

二、软件环境

MicrosoftVisualC++

三、问题的需求分析

程序以二维数组作为矩阵的存储结构,通过键盘输入矩阵维数n,动态

分配内存空间,创建n维矩阵。矩阵建立后再通过键盘输入矩阵的各个元素

值;也可以通过文件读入矩阵的各项数据(维数及各元素值)。

当要对矩阵作进一步操作(A*B或A*B^(-1))时,先判断内存中是否已

经有相关的数据存在,若还未有数据存在则提示用户先输入相关数据。

当要对矩阵进行求逆时,先利用矩阵可逆的充要条件:|A|!=0判断矩

阵是否可逆,若矩阵的行列式|A|==0则提示该矩阵为不可逆的;若

|A|!=0则求其逆矩阵,并在终端显示其逆矩阵。

四、算法设计思想及流程图

1.抽象数据类型

ADTMatrixMulti{

数据对象:D={a(I,j)|i=1,2,3,…,n;j=1,2,…,n;a(i,j)∈ElemSet,n为矩阵维

数}

数据关系:R={Row,Col}

Row={|1<=i<=n,1<=j<=n-1}

Col={|1<=i<=n-1,1<=j<=n}

基本操作:

Swap(&a,&b);

初始条件:记录a,b已存在。

操作结果:交换记录a,b的值。

CreateMatrix(n);

操作结果:创建n维矩阵,返回该矩阵。

Input(&M);

初始条件:矩阵M已存在。

操作结果:从终端读入矩阵M的各个元素值。

Print(&M)

初始条件:矩阵M已存在。

操作结果:在终端显示矩阵M的各个元素值。

ReadFromFile();

操作结果:从文件读入矩阵的相关数据。

Menu_Select();

操作结果:返回菜单选项。

MultMatrix(&M1,&M2,&R);

初始条件:矩阵M1,M2,R已存在。

操作结果:矩阵M1,M2作乘法运算,结果放在R中。

DinV(&M,&V);

初始条件:矩阵M,V已存在。

操作结果:求矩阵M的逆矩阵,结果放入矩阵V中。

MatrixDeterm(&M,n);

初始条件:矩阵M已存在。

操作结果:求矩阵M的行列式的值。

}ADTMatrixMulti

2.矩阵求逆算法设计思想

算法采用高斯-约旦法(全选主元)求逆,主要思想如下:

首先,对于k从0到n-1作如下几步:

①从第k行、第k列开始的右下角子阵中选取绝对值最大的元素,

并记住此元素所在的行号与列号,再通过行交换和列交换将它交

换到主元素位置上。这一步称为全选主元。

②主元求倒:M(k,k)=1/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,k)*A(i,k);k=1,2,…,n;

D=∑a(k,j)*A(k,j);k=1,2,…,n;

再利用函数的递归调用法实现求其值。

4.各函数间的调用关系

5.流程图

Main()

ReadFromFile()

DinV()

Swap()

Print()

Menu_Select()

MatrixDeterm()

CreateMatrix()

MultMatrix()

Input()

否是

否是

开始

switch(Menu_Select())

ca1:

ca3:

ca2:

n>0

输入矩阵维数n

输入矩阵A,B输出矩阵维数n

system(“pau”);

通过键盘输入需对哪个

矩阵求逆,求出相应该的

逆阵,并显示求得的逆阵

system(“pau”);若矩阵

不可逆则返回主菜单

ca4:

R=A*B并显示矩

阵R

system(“pau”);

ca5:

五、源代码

#include<>

#include<>

#include<>

#include<>

#include<>

#include<>

R=A*B^(-1)显示矩阵R

system(“pau”);若B不

可逆,则返回主菜单

ca6:

从指定文件中读

入矩阵数据

ca0:

exit(0);

结果

#defineYES1

#defineNO0

typedeffloatElemType;

ElemType**A;.3f通过键盘输入各项数据|");

puts("tt|2.显示矩阵A,B|");

puts("tt|3.矩阵求逆,并显示逆矩阵|");

puts("tt|4.求矩阵运算A*B,并显示运算结果|");

puts("tt|5.求矩阵运算A*B^(-1),并显示运算结果|");

puts("tt|6.从文件读入矩阵A,B与维数n|");

puts("tt|0.退出|");

puts("tt***************************************");

printf("tt请选择(0-6):");

c=getchar();

}while(c<'0'||c>'6');

return(c-'0');

}

voidReadFromFile()//从指定文件读入矩阵的维数及矩阵各元素的值

{

inti,j;

FILE*fp;

if((fp=fopen("","r"))==NULL)

{

puts("无法打开文件!!!");

system("pau");

exit(0);

}

fscanf(fp,"%d",&n);//读入矩阵维数

A=CreateMatrix(n);//创建矩阵ABVR

B=CreateMatrix(n);

V=CreateMatrix(n);

R=CreateMatrix(n);

for(i=0;i

{

for(j=0;j

{

fscanf(fp,"%f",&A[i][j]);

}

}

for(i=0;i

{

for(j=0;j

{

fscanf(fp,"%f",&B[i][j]);

}

}

puts("nn读文件成功");

fclo(fp);

flag=1;

}

intmain()

{

inti;

charc,h;

charstr[10];

for(;;)

{

switch(Menu_Select())

{

ca1:flag=-1;

for(;;)

{

system("cls");

printf("nnt矩阵维数n:");

scanf("%d",&n);

gets(str);

if(n>0)

break;

el

{

printf("nt输入有误,请重新输入!n");

puts("");

system("pau");

}

}

A=CreateMatrix(n);

B=CreateMatrix(n);

V=CreateMatrix(n);

R=CreateMatrix(n);

Input(A);

Input(B);

break;

ca2:system("cls");

if(flag==-1)

{

puts("nnt不存在任何矩阵数据,请先输入数据");

system("pau");

break;

}

puts("n");

printf("tA=");

Print(A);

puts("n");

printf("tB=");

Print(B);

puts("");

system("pau");

break;

ca3:system("cls");

if(flag==-1)

{

puts("nnt不存在任何矩阵数据,请先输入数据");

system("pau");

break;

}

for(;;)

{

printf("nnt输入需要求逆的矩阵(A/B):");

h=getchar();

c=getchar();

//h=getchar();

if(c=='A'||c=='a')

{

i=DinV(A,V);

if(i==-1)

{

puts("nnt矩阵A的行列式等于0,不可

逆!");

system("pau");

break;

}

printf("tA=");

Print(A);

puts("n");

printf("A^(-1)=");

Print(V);

puts("");

system("pau");

break;

}

elif(c=='B'||c=='b')

{

i=DinV(B,V);

if(i==-1)

{

puts("nnt矩阵B的行列式等于0,不可

逆!");

system("pau");

break;

}

printf("tB=");

Print(B);

puts("n");

printf("B^(-1)=");

Print(V);

puts("");

system("pau");

break;

}

el

puts("nnt输入有误,请重新输入!n");

}

break;

ca4:system("cls");

if(flag==-1)

{

puts("nnt不存在任何矩阵数据,请先输入数据");

system("pau");

break;

}

MultMatrix(A,B,R);

printf("nntA*B=");

Print(R);

puts("");

system("pau");

break;

ca5:system("cls");

if(flag==-1)

{

puts("nnt不存在任何矩阵数据,请先输入数据");

system("pau");

break;

}

i=DinV(B,V);

if(i==-1)

{

puts("nnt矩阵B的行列式等于0,不可逆!");

system("pau");

break;

}

MultMatrix(A,V,R);

printf("nnA*B^(-1)=");

Print(R);

puts("");

system("pau");

break;

ca6:system("cls");

ReadFromFile();

puts("");

system("pau");

break;

ca0:puts("tt正常退出");

exit(0);

break;

}

}

return0;

}

六、运行结果

1.主界面:

2.输入6,回车,从文本文件中读入矩阵数据:

3.回车,回到主菜单界面;输入2回车,显示从文件读入的矩阵数据:

4.回车,回到主菜单界面;输入3回车,对指定矩阵求逆:(由于这里矩阵A

是不可逆的,因此仅以矩阵B为例)

5.回车,回到主菜单界面;输入4回车,求矩阵运算A*B:

6.回车回到主菜单界面,输入5回车,求A*B^(-1)的值:

7.回车回到主菜单界面,输入0回车,退出程序;如果需要自定矩阵维数及

各元素值,请利用主菜单里的1号功能自行输入数据,再进行以上几种运算

操作。

七、收获及体会

通过这次课程设计,让我再次复习了线性代数里矩阵的相关知识,比如

n维矩阵的求逆、矩阵可逆的充分必要条件(|A|!=0)、矩阵与矩阵的乘

法运算、行列式求值方法等。同样的,还让我复习了大量C语言里有关数组

的一些重要概念,比如多维数组的动态分配问题、数组与指针的关系等。

记得在这个学期新开设的单片机基础课上,吴涛老师曾多次强调,让我

们一定要经常锻炼自己的编程能力,他常对我们说:“编程是思维的体操。”

尽管我在这方面的能力和实力非常得有限,也远远不及班上的其他同学,但

我通过这次课程设计充分体会到了这句话的精华。

电脑程序作为人体大脑思维的延伸,程序的功能也会因为大脑思维的不

断完善而变得更加强大,所以我决定今后要加强在这方面的锻炼和学习,以

此来激励自己不断前进!

八、参考文献

《数据结构(C语言版)》严蔚敏,吴伟民编著清华大学出版社

《C语言程序设计》洪维恩编著中国铁道出版

《C语言程序设计教程》谭浩强张基温唐永炎编著高等教育出版社

《工程数学——线性代数第四版》同济大学应用数学系编高等教育出版社

计051本林垂敏

2007-12-13

本文发布于:2022-11-12 17:02:49,感谢您对本站的认可!

本文链接:http://www.wtabcd.cn/fanwen/fan/88/5548.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:矩阵维数
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图