数据结构稀疏矩阵应用

时间:2019-05-12 02:20:27下载本文作者:会员上传
简介:写写帮文库小编为你整理了多篇相关的《数据结构稀疏矩阵应用》,但愿对你工作学习有帮助,当然你在写写帮文库还可以找到更多《数据结构稀疏矩阵应用》。

第一篇:数据结构稀疏矩阵应用

实验五 数组的运算

实验目的:

掌握稀疏矩阵的压缩存储方法及主要运算的实现。实验内容与要求:

设计一个稀疏矩阵计算器,要求能够:⑴输入并建立稀疏矩阵;⑵输出稀疏矩阵;⑶执行两个矩阵相加;⑷求一个矩阵的转置矩阵。

程序代码:

#include #define smax 20 typedef int datatype;

typedef struct { int i,j;

datatype v;

}node;typedef struct

{ node data[smax];

int m,n,t;

}spmatrix;

void creat(spmatrix a)创建输出稀疏矩阵 { int k=0;

printf(“请输入稀疏矩阵:n”);

scanf(“%d,%d,%d”,&a.m,&a.n,&a.t);

scanf(“%d,%d,%d”,&a.data[0].i,&a.data[0].j,&a.data[0].v);

while(a.data[k].v!=0)以0元素作为结束标志,因为稀疏矩阵不包含0元素

{k++;

scanf(“%d,%d,%d”,&a.data[k].i,&a.data[k].j,&a.data[k].v);

}

printf(“输出的稀疏矩阵是:n”);

printf(“%d,%d,%dn”,a.m,a.n,a.t);

for(k=0;k

printf(“%d,%d,%dn”,a.data[k].i,a.data[k].j,a.data[k].v);

printf(“n”);}

void transpose(spmatrix a)转置函数 { int p,q,k=0;

printf(“请输入稀疏矩阵:n”);

scanf(“%d,%d,%d”,&a.m,&a.n,&a.t);

scanf(“%d,%d,%d”,&a.data[0].i,&a.data[0].j,&a.data[0].v);

while(a.data[k].v!=0)

{k++;

scanf(“%d,%d,%d”,&a.data[k].i,&a.data[k].j,&a.data[k].v);

}

for(k=0;k

{p=a.data[k].i;a.data[k].i=a.data[k].j;a.data[k].j=p;}

printf(“输出转置后的初步矩阵元素:n”);

for(k=0;k

printf(“%d,%d,%dn”,a.data[k].i,a.data[k].j,a.data[k].v);

for(p=0;p

for(k=0;k<(a.t-p);k++)

{if(a.data[k].i>a.data[k+1].i ||(a.data[k].i==a.data[k+1].i && a.data[k].j>a.data[k+1].j))

{q=a.data[k].i;a.data[k].i=a.data[k+1].i;a.data[k+1].i=q;

q=a.data[k].j;a.data[k].j=a.data[k+1].j;a.data[k+1].j=q;

q=a.data[k].v;a.data[k].v=a.data[k+1].v;a.data[k+1].v=q;

}

} printf(“输出转置后的稀疏矩阵:n”);printf(“%d,%d,%dn”,a.n,a.m,a.t);for(k=1;k<(a.t+1);k++)此处下标加1是根据输出结果判定而来,不知道原因

printf(“%d,%d,%dn”,a.data[k].i,a.data[k].j,a.data[k].v);printf(“n”);}

void add(spmatrix a,spmatrix b)求和函数 {spmatrix c;int x=0,y=0,z=0;int p,q,r=0;printf(“请输入稀疏矩阵a:n”);scanf(“%d,%d,%d”,&a.m,&a.n,&a.t);scanf(“%d,%d,%d”,&a.data[0].i,&a.data[0].j,&a.data[0].v);while(a.data[x].v!=0)

{x++;

scanf(“%d,%d,%d”,&a.data[x].i,&a.data[x].j,&a.data[x].v);

} printf(“请输入稀疏矩阵b:n”);scanf(“%d,%d,%d”,&b.m,&b.n,&b.t);scanf(“%d,%d,%d”,&b.data[0].i,&b.data[0].j,&b.data[0].v);

while(a.data[y].v!=0)

{y++;

scanf(“%d,%d,%d”,&b.data[y].i,&b.data[y].j,&b.data[y].v);

}以上为重新创建两个稀疏矩阵,方便运算 if(a.m==b.m && a.n==b.n)首先行列相等的稀疏矩阵才能相加

{for(x=0;x

{c.data[z].i=a.data[x].i;

c.data[z].j=a.data[x].j;

c.data[z].v=a.data[x].v;

z++;

}

for(y=0;y

{c.data[z].i=b.data[y].i;

c.data[z].j=b.data[y].j;

c.data[z].v=b.data[y].v;

z++;

}两个for循环先后把a,b两个稀疏矩阵元素放到一个新的稀疏矩阵c里去

printf(“输出结合后的初步稀疏矩阵C的元素:n”);进行一次打印

for(z=0;z<(a.t+b.t);z++)printf(“%d,%d,%dn”,c.data[z].i,c.data[z].j,c.data[z].v);

for(p=0;p<(a.t+b.t);p++)冒泡排序法对新矩阵元素排序

for(z=0;z<(a.t+b.t-p);z++){if(c.data[z].i>c.data[z+1].i ||(c.data[z].i==c.data[z+1].i && c.data[z].j>c.data[z+1].j))有这几种情况需要重新排序,首先是进行行对比(前行大于后行进行交换),然后当行相等时在进行列对比(前列大于后列时在进行交换),其他情况均不用交换

{q=c.data[z].i;c.data[z].i=c.data[z+1].i;c.data[z+1].i=q;

q=c.data[z].j;c.data[z].j=c.data[z+1].j;c.data[z+1].j=q;

q=c.data[z].v;c.data[z].v=c.data[z+1].v;c.data[z+1].v=q;} } printf(“输出排序后的稀疏矩阵C的元素:n”);进行一次打印

for(z=1;z<(a.t+b.t+1);z++)printf(“%d,%d,%dn”,c.data[z].i,c.data[z].j,c.data[z].v);

for(z=1;z<(a.t+b.t+1-r);z++)主循环,保证阅读每一个数组元素

if(c.data[z].i==c.data[z+1].i && c.data[z].j==c.data[z+1].j)在对排好序后的矩阵进行相等行列元素的合并

{c.data[z].v=c.data[z].v+c.data[z+1].v;

r++;此处是关键,记录此时的步骤,如果进行一次运算后,那么后面的循环就要少一次,包括再回到主循环时也要少一次

for(z+1;(z+1)<(a.t+b.t+1-r);z++)小循环是让后面的每一个数组元素向前移动一个位置,掩盖掉相等行列元素

{c.data[z+1].i=c.data[z+2].i;

c.data[z+1].j=c.data[z+2].j;

c.data[z+1].v=c.data[z+2].j;

} } printf(“输出最终结果的稀疏矩阵C:n”);printf(“%d,%d,%dn”,a.m,a.n,(a.t+b.t-r));输出稀疏矩阵表头时只需将行列元素交换输出即可,元素个数输出时要注意相等行列元素合并进行了几次操作,即用r记录操作步骤的次数,每进行一次操作那么最终稀疏矩阵就少一个数组元素,同时r又是伴随步骤增加的

for(z=1;z<(a.t+b.t+1-r);z++)原理同上

printf(“%d,%d,%dn”,c.data[z].i,c.data[z].j,c.data[z].v);} Else给出稀疏矩阵表开头行列总和不等时则无法计算

printf(“输入的稀疏矩阵a,b不是行列相等的矩阵。n”);}

void main()主函数 {spmatrix a,b;creat(a);transpose(a);add(a,b);}

心得体会:程序开头老师指点了一下,后面的算法以及函数全为自己长时间编写,全用一维数组包含多个数据的思想去操作,抓住主的数组元素值的变化,步步为营,一个目标一个目标的实现,在操作时最好对这次操作结果做一次打印,就像程序中进行前后元素交换的时候主数组下标加1是为什么没有研究透,不过通过每步打印发现了这个规律,要不然找死都找不出结果为何少一个元素,开头元素为何是一串数字乱码。

第二篇:数据结构课程设计(矩阵的运算)

数 据 结 构

课程设计报告

题 目: 专 业: 班 级: 学 号: 姓 名: 指导老师: 时 间:

一、课程设计题目及所涉及知识点

设计题目是“矩阵的运算”,所涉及的知识点主要是:

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……while语句来实现功能的循环操作。

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 # 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”);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

for(j=0;j<(2*s.i);j++)

{ if(j

else if(j==s.i+i)s1.b[i][j]=1.0;

else s1.b[i][j]=0.0;

}

for(i=0;i

{ for(k=0;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

s1.b[i][j]=s1.b[i][j]/t;} float y=1.0;for(i=0;i

printf(“对不起,您输入的矩阵没有逆矩阵”);

else

{ for(i=0;i

for(j=0;j

{ for(j=0;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”);

printf(“矩阵转置运算请按1n矩阵的加法运算请按2n矩阵的乘法运算请按3n矩阵的减法运算请按4n矩阵的逆运算请按5n结束请按0:n”);printf(“******************************n”);scanf(“%d”,&m1);if(m1==1){ printf(“您选择进行的操作是矩阵的转置运算nn”);

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(“您选择进行的操作是矩阵的加法运算nn”);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

if(m1==5){ printf(“您选择进行的操作是矩阵的逆运算nn”);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

2、运行结果(如下图):

(1)、执行的首界面:

(2)、矩阵的转置运算:

(3)、矩阵的加法运算:

(4)、矩阵的减法运算:

(5)、矩阵的乘法

(6)、矩阵的逆运算:

(7)、矩阵可以循环运算:

六、指导老师评语及成绩

第三篇:可逆矩阵及其简单应用

石家庄学院毕业设计(论文)

它的系数矩阵和增广矩阵的性质上,并且解方程组的过程也表现为变换这些矩阵的过程。可逆矩阵作为矩阵乘法的逆运算,是矩阵的一种重要运算,在解决矩阵问题中起着重要的作用。因而掌握可逆矩阵的求法,在解决实际问题时,往往可以起到事半功倍的效果。本文将对一些常用的可逆矩阵的求法作系统的总结,并进一步介绍几种常见得可逆矩阵的在数学领域和通讯领域的简单应用。【关键词】矩阵 可逆矩阵 通信

【Abstract】In the discussion of linear equations, we can see that some

可逆矩阵及其简单应用

important properties of the linear equations are reflected in its coefficient matrix and augmented matrix of nature, what`s more, the process of the solution performance of the process of transformation of these matrices.Invertible matrix multiplication as the inverse of the matrix is an important matrix operations,and plays an important role in solving the problem.master ring the method of Invertible matrix often can play a multiplier effect in solving practical problems.The following are the system summary of the commonly used reversible method for the evaluation of Invertible matrix, and further descripitions of several common application in the field of mathematics and simple communications.【Key Words】Matrix Invertible matrix Communications

石家庄学院毕业设计(论文)

目 录

前言...................................................................5

一、可逆矩阵...........................................................5

二、可逆矩阵的性质及求法...............................................5

(一)性质..............................................................5

(二)逆矩阵求法.........................................................6

三、可逆矩阵的简单应用.................................................10

(一)可逆矩阵在数学方面的应用............................................10

(二)可逆矩阵在通信方面的应用.........................................11(1)加密保密通信模型.......................................................12(2)可逆矩阵的应用........................................................12(3)加密密钥的生成........................................................13(4)解密密钥的生成........................................................14(5)明文矩阵的选择........................................................14(6)加密矩阵的选择........................................................14(7)算法优化............................................................14 结论...................................................................15 参考文献...............................................................15 致谢 16

可逆矩阵及其简单应用

前言

矩阵作为高等代数,这一伟大数学图腾的重要分支的一大重要部分,在我们的生活,学习,工作,更是在人类的进步中发挥了卓越的工具作用。可逆矩阵是矩阵知识的一个基础支流,借助自身优秀的性质特点,为更高层的矩阵问题的解决提供了便利,更是丰富了矩阵的理论内容。

一,可逆矩阵

定义:在线性代数中,给定一个 n 阶方阵,其中阵,记作。,若存在一 n 阶方阵,使得 是 的逆矩

为 n 阶单位矩阵,则称是可逆的,且

若方阵的逆阵存在,则称为非奇异方阵或可逆方阵。

二、可逆矩阵的性质及求法

(一)性质

(1)如果A可逆,则A也可逆,且(A1)1A.

由可逆的定义,显然有A与A是互逆的.(2)如果

11A、B是两个同阶可逆矩阵,则(AB)也可逆,且(AB)1B1A1.

这是因为(AB)(B1A1)A(BB1)A1AEA1AA1E

(B1A1)(AB)B1(A1A)BB1EBB1BE 所以(AB)1B1A1.

这个结论也可以推广到有限个可逆矩阵想乘的情形.(3)可逆矩阵A的转置矩阵A也是可逆矩阵,且(A)这是因为

A(A)(AA)EE

(A)A(AA)EE

1TT1TTT1T1TTTT1(A1)T.

石家庄学院毕业设计(论文)

所以(AT)1(A1)T.(4)如果A是可逆矩阵,则有A这是因为 AA所以

A111A1.

E,两边取行列式有 AA11,11A. A

(二)逆矩阵求法

方法一伴随矩阵法

定义1设A=aij是n级方阵,用Aij,表示A的(ij)元的代 数余子式(i=l,2,⋯,n),A11矩阵An1A1n称为A的伴随矩阵,记作A* Ann若A0,并且当A可逆时有A1*A A这种方法在理论上很有用,在实际计算中常用于2级或 3级矩阵。

123例:A=456用伴随矩阵法求A

346123解::因为A45856=1,所以A可逆,而A112

463464845,A120A131,A21=0,A22=-3,A23=2,A31=1,A32=4 3634A33=-3 2011*A=034 AA123方法二 二阶矩阵的公式求逆法 设Aab(其中ad-bc0,即A0),cd

可逆矩阵及其简单应用

dA则AcAbA1db= aAcaA这个公式的推导思想是从AAI这个重要结论出发,构 造一个矩阵B,去左乘A使其等于单位矩阵I,即若AB=I,那 么A =B。这种方法只适用于求二阶矩阵的逆矩阵。我们称为

二阶矩阵的公式求逆法。方法三初等变换法

这是一种最常用的一种方法,为了看出如何用初等变换 法求逆矩阵,先证一个引理:

引理l可逆矩阵的简化行阶梯形一定是单位矩阵。换句话说,可逆矩阵可以经过一系列初等变

初等航变换I,A,同理有换化成单位矩阵。即A,IA初等列变换I IA123例:A458用初等变换法求A

346123100123100458010034410 346001023301100201100201011111011111023301001123100201 010034230011201所以A034

123方法四利用解线性方程组来求逆矩阵

若n级矩阵A可逆,则AAI,于是A的第j列是线性

方程组的AXj的解,j=1,2,⋯,n因此我们可以去解线性方 程组AX,其中 =b1,b2,,bn'然后把所得的解的公共式 石家庄学院毕业设计(论文)

中b1,b2,,bn分别用l,O,⋯,O;0,l,⋯,O;⋯;0,⋯,O,l代替,便可求得A的第l,2,⋯,n列。这种方法在某些时候可能比 用初等变换法求逆矩阵稍微简单些。方法五分块求逆法

当一个可逆矩阵的级数较大时,即使用初等变换法求它 的逆矩阵仍然计算量较大,如果把该矩阵分块,再对分块矩阵 求逆矩阵,则可减少计算量。用分块求逆法解题的具体步骤为:(1)根据所给矩阵A的特点分块为A=常用的分块求逆公式有:

设A,B,A1,A2,⋯,As均可逆,则 A11A21A12(2)选择适当的分块求逆公式 A22A1A01: =0B01A110A100 2: = 1B0A0As1sA1A1CB1AC 4:110BB1BCAB10 6:0BA010B1111A1AC3:0B0110 B1B1CA10A5:1BCAA1 0B1 11ACB07:As0As1A1C =  8:B10A01A010A52例:设四阶方阵00解:设A121000000试求A1 12110是分块矩阵,易 A2A15212A,则A221110

可逆矩阵及其简单应用

131211得A1,A21253120252031故A1=001330013002 313方法六利用哈密尔顿~凯莱定理求逆矩阵

哈密尔顿一凯莱定理:设A是数域P上一个nn级矩 阵,fEA 是A的特征多项式,则fAAna111a22annAn1AE0设fAAnan11Aa2An2an1AanE

其中ann1A

当A可逆时,A0,即an0

由Ana11Anan22Aan1AanE0可得

1a(Ana1An1a22Anan1A)E n1A(An1an2a1Aa32Anan1E)E nA11a(An1a31An2a2Anan1E)n例设A111210试用哈密尔顿一凯莱定理求A1 110解:fEA32230 A32A23E0

A13A22AE A111013A22A=30132

方法七利用最小多项式求逆矩阵

定义:以n阶矩阵A为根的多项式中,其中次数最低的 首项为l的以A为根的多项式,称为A的最小多项式。

121

 石家庄学院毕业设计(论文)

引理2设m()是矩阵A的最小多项式,那么f为根的充分必要条件是m()整除f以A



由上述引理和定义及哈密尔顿一凯莱定理知:非退化矩 阵A的最小多项式的常数项非零,即设A的最小多项式为mma1m1am1am则有常数项am0又由于mAAma1Am1am1AamE,则得11 Am1a1Am2am1EAE,am故A1Am1a1Am2am1E am下面举例说明此法的应用,但此法并不常用。

110例,求A010的逆矩阵。

001解:因为A的特征多项式为EAI,所以A的

最小多项式为AI的因式,显然A—E≠0,而AE0,因

2此A的最小多项式为m121,即a210,所

2323以由

A11Am1a1Am2am1E得 am110A1A2E2EA010

101

三、可逆矩阵的简单应用

(一)可逆矩阵在数学方面的应用

逆矩阵在对角化中的应用

定理1

n阶方阵A相似于对角矩阵的充分必要条件是A由n个线性无关1的特征向量,且当A相似于对角矩阵时,的主对角线元素就是A的全部特征值.可逆矩阵及其简单应用

推论1 方阵A相似于对角矩阵的充分必要条件是A的属于每个特征值的线性无关的特征向量个数正好等于该特征值的重数.定理21 如果n阶方阵A有n个互不相同的特征值(即A的特征值都是单特征值),则A必相似于对角矩阵.3.1.2求n阶方阵的特征值与特征向量的一般步骤.第一步:计算特征多项式AI

第二步:求出特征方程AI0的全部根1,2,,n(重根按重数计算),则 1,2,,n就是A的全部特征值.如果i为特征方程的单根,则称i为A的单特征根;如果i为特征方程的k重根,则称i为A的k重特征值,并称k为i的重数.第三步:对A的相异特征值中的每个特征值i,求出齐次线性方程AiIx0的一个基础解系i1,i2,,iki,则 i1,i2,,iki就是对应于特征值i的特征空间的一个基,而A的属于i的全部特征向量为



x ci1i1ci2i2cikiiki

(其中ci1,ci2,ciki为不全为0的任意常数)

3.1.3如果n阶方阵A相似于对角矩阵,则A的相似对角化的一般步骤如下:

第一步:求出A的全部特征值1,2,,n;第二步:对A的相异特征值中的每个特征值i,求出齐次线性方程组

AiIx0 的一个基础解系,将所有这样的基础解系中的向量合在一起,假定这样的向量共有n个,它们就是A的n个线性无关的特征向量1,2,,n;1第三步:令矩阵P=1,2,,n,则有PAPdiag1,2,,n,其中i是属于特征值i的特征向量i1,2,,n.注意P的列向量的排列次序于与对角矩阵的主对角线元素的排列次序相一致

(二)可逆矩阵在通信方面的应用

保密通信是当今信息时代一个非常重要的课题.无数的科技工作者为此做了大量的工作,先后提出 了许多较为有效的保密通信模型.其中,基于加密技术的保密通信模型是其中最为基本而且最具活力的

石家庄学院毕业设计(论文)

一种.

(1)加密保密通信模型

基于加密技术的保密通信模型如下:

发送方采用某种算法将明文数据加密转换成密文数据后发送给接收方,接收方则可以采用相对应 的某种算法将密文数据解密转换成明文数据.

2可逆矩阵的应用

显然一种加密技术是否有效,关键在于是密文能否还原成明文.

设有矩阵方程C=AB,其中B为未知矩阵.我们知道,如果A为可逆矩阵,则方程有唯一解 B=A1C,其中A1是A的逆矩阵.

因此,可逆矩阵可以有效地应用于加密技术.

设A为可逆矩阵,B为明文矩阵,c为密文矩阵.

加密算法加密时,采用下面的矩阵乘法:

C=BA 或C=AB.

32010221 例如,设加密密钥矩阵A为123201213225明文矩阵B为43121121423345 67

可逆矩阵及其简单应用

320132022125则密文矩阵c等于1232430121122.2.2 解密算法

11214233446425513615129 615321138711113024解密时,采用下面的矩阵乘法:

BCA1或BA1C

其中,A1为A的逆矩阵.

112401011 例如,针对上面的加密密钥矩阵A,解密密钥矩阵A为11362161075如果密文矩阵C为1***11773269 2186219611660697945558= 2372631317081则相应的明文矩阵B应等于1124701015113612161013密钥的生成

如何快速而有效地构造一个可逆矩阵作为加密密钥和求出其逆矩阵作为解密密钥是利用可逆矩阵 实现保密通信的关键. 3加密密钥的生成

我们知道,初等矩阵都是可逆的,而且初等矩阵的乘积仍然是可逆的.因此,我们可以考虑利用若干 个初等矩阵的乘积作为加密密钥.

这种做法的好处是,我们可以自由地选择初等矩阵的数量和每个初等矩阵的类型,以及由单位矩阵 得到初等矩阵的具体初等变换.

在实际应用中,可以通过对单位矩阵连续施加一序列所选择的初等变换得到加密矩阵. 根据文献[3],通常所谓的矩阵的三种基本类型的初等变换: 1)交换两行或两列; 2)数乘某一行或某一列;

3)将某一行(或某一列)的K倍加到另一行(或另一列)上,实质上只有2)和3)两种是独立的,1)可以通过2)和3)来表示.因此,在设计算法时,可以利用如下矩阵 结构(下文称其为变换矩阵):

行号列号倍数行号列号

石家庄学院毕业设计(论文)

其中行代表变换,列表示变换的具体内容,而且第i行表示第i次变换.比如,变换1表示第l行乘一3;

变换2表示第3列乘5;变换3表示第3行的一1倍加到第2行上;变换4表示第3列的3倍加到第2列 上,等等. 4解密密钥的生成 设APP12P3Pn,其中Pi只是初等矩阵,则

11111P的逆矩阵. A1PnP3P2P1其中Pi是设P只是对单位矩阵I做初等变换K得到的初等矩阵,则只需对单位矩阵I做K的逆变换即可

得到Pi1.

显然,在实际应用,生成解密密钥只需要再次利用生成加密密钥时的变换矩阵对单位矩阵做一序列 的初等逆变换即可. 其_______它问题

除了密钥矩阵的生成这一基本问题以外,在利用可逆矩阵实现保密通信时,还有一些问题值得我们

探讨.

5明文矩阵的选择

如果明文矩阵刀为方阵,则当B为可逆矩阵时有

AB1C或ACB1,其中B1为B的逆矩阵.

因此,如果窃密者以某种方式窃取到一对明文和相应的密文,碰巧其中的明文矩阵可逆,那么窃密者可 以轻而易举地破解密文.

鉴于以上考虑,在实际应用时,明文矩阵不要采用方阵.

另外,在实际应用中,明文并不总是恰好可以分成整数个矩阵,出现这种情况时需要补充一些数据. 补充的数据可以是有意义的,也可以是无意义的.有时,我们可以利用这些附加数据来达到某种特殊的 效果,比如数据的完整性检验等. 6加密矩阵的选择

设c=AB,根据矩阵乘法的定义,乘积矩阵C中第i行第j列的元素Cij,等于矩阵A中第i行的所 有元素与矩阵B中第j列的对应元素之积的累加和.

因此,利用可逆矩阵来实现保密通信的另一个问题是,如果加密矩阵选择得不好,密文矩阵的元素 长度会急剧膨胀.

为了避免出现这种情况,加密矩阵A最好满足以下条件:

对任意的明文矩阵B,密文矩阵C中的每一个元素的长度都不超过明文矩阵B中对应位置上的元 素的长度. 或者退而求其次:

对任意的明文矩阵B,密文矩阵C中所有元素的总长度不超过明文矩阵B中所有元素的总长度. 如果能找到一个加密矩阵,使得对任意的明文矩阵,密文矩阵中所有元素的总长度在一个比较理想 的程度上小于明文矩阵中所有元素的总长度,那么这时的加密算法同时也是一种较好的压缩算法. 7算法优化

设加密矩阵A为咒阶矩阵,明文矩阵B为n行m列矩阵,利用“向量”的有关知识,密文矩阵c的第 i行(行向量Ci(i=1,2,⋯,n)可以表示为

可逆矩阵及其简单应用

CiAi1B1Ai2B2AinBn其中Aij(j=1,2,⋯,n)为矩阵A的第i行第j列位置上的元素,而Bn则为矩阵B的第n行(行向量).

显然,密文矩阵的每一个行向量都是明文矩阵的所有行向量的一种线性组合,其组合系数正好是加 密矩阵的相应行上的所有元素.

根据矩阵乘法的定义直接计算密文矩阵时,计算密文矩阵的每个元素需要做粗次乘法和咒一1次加 法,因此计算整个密文矩阵总共需要mn次乘法和mn2n1次加法.

2利用上述线性组合关系来计算密文矩阵时,计算密文矩阵的每行元素需要做mn次乘法和mn计算整个密文矩阵也总共需要进行mn次乘法和mn2n1次加法,因此

n1次加法.

但是,如果加密矩阵中含有一定数量的0元素,则利用线性组合来计算密文矩阵就有较大的优势. 加密矩阵每增加一个0元素,计算密文矩阵就要少做m次乘法和m次加法.

在实际应用中,加密矩阵一般都含有一定数量的0元素.__ 结论

通过本篇论文对可逆矩阵的性质及其求法的探讨,我们更深一步的讲述了可逆矩阵在数学学科和生活通信保密工作的重要应用,我们可以推知逆矩阵将我们遇到的通常难解决的问题,简易化,模型化,以达到矩阵的转化与变形,是我们的工作事半功倍,更解决掉了实际的问题。我们也由此总结归纳,再一次证明了可逆矩阵的重要性。

参考文献

[1]熊小兵.可逆矩阵在保密通信中的应用.[D].武汉大学计算机学院.2007-6.[2] 胡淑娟, 马宝艳.可逆矩阵及求逆矩阵的方法.[D].河南财经学院成功学院.2010-4.[3]石生明,王萼芳.高等代数.[M].第三版.北京:高等教育出版社,2003∶273-281.[4]钱吉林.高等代数题解精粹.[M].第二版.北京:中央民主大学出版社,2010:112-149.[5] 杨奇、田代军、韩维信.线性代数与解析几何[M].天津:天津大学出版社,2002:112-128.[6] 郭来鹏, 对可逆矩阵的探讨, [D].数学与信息科学学院.2008-6.石家庄学院毕业设计(论文)

致谢

感谢我的指导老师„„亲切关怀和悉心指导。她严肃的科学态度,严谨的治学精神,精益求精的工作作风,深深地感染和激励着我。从课题的选择到项目的最终完成,刘老师都始终给予我细心的指导和不懈的支持。三年来,她不仅在学业上给我以精心指导,同时还在思想、生活上给我以无微不至的关怀,在此谨致以诚挚的谢意和崇高的敬意。

在此,我还要感谢在一起度过愉快的大学三年生活的同学们,正是由于你们的帮助和支持,我才能克服一个一个的困难和疑惑。在论文即将完成之际,我的心情无法平静,从开始进入课题到论文的顺利完成,有多少可敬的师长、同学、朋友给了我无言的帮助,在这里请接受我诚挚的谢意!最后我还要感谢培养我长大含辛茹苦的父母,谢谢你们!

第四篇:数据结构课程设计报告n维矩阵乘法

数据结构

课程设计报告

设计题目:

n维矩阵乘法:A

B-1

计算机科学与技术

计本

指导教师

起止时间

2007.X.3-2007.X.11

学年第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

=

{|

<=

i

<=

n,1

<=

j

<=

n-1}

Col

=

{|

<=

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的行列式的值。

}

ADT

MatrixMulti

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

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

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

从第k行、第k列开始的右下角子阵中选取绝对值最大的元素,并记住此元素所在的行号与列号,再通过行交换和列交换将它交换到主元素位置上。这一步称为全选主元。

主元求倒:M(k,k)

=

/

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.各函数间的调用关系

Main()

ReadFromFile()

DinV()

Swap

()

Print()

Menu_Select()

MatrixDeterm()

CreateMatrix()

MultMatrix()

Input()

5.流程图

开始

switch(Menu_Select())

case

1:

case

3:

case

2:

n

0

?

输入矩阵维数n

输入矩阵A,B

输出矩阵维数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

#include

#include

#include

#include

#include

#define

YES

#define

NO

0

typedef

float

ElemType;

ElemType

**A;

//矩阵A

ElemType

**B;

//矩阵B

ElemType

**R;

//矩阵R,用于存放运算结果

ElemType

**V;

//矩阵V,存放逆矩阵

int

n=0;

//矩阵维数

int

flag=-1;

//标记

void

swap(ElemType

*a,ElemType

*b)

//交换记录a,b的值

{

ElemType

c;

c=*a;

*a=*b;

*b=c;

}

ElemType

**CreateMatrix(int

n)

//创建n维矩阵,返回该矩阵

{

int

i,j;

ElemType

**M;

M

=

(ElemType

**)malloc(sizeof(ElemType

*)*n);

if(M

==

NULL)

exit(1);

for(i=0;i

{

*(M+i)

=

(ElemType

*)malloc(sizeof(ElemType)*n);

for(j=0;j

*(*(M+i)+j)

=

0;

}

return

M;

}

ElemType

MatrixDeterm(ElemType

**M,int

n)

/*递归法求n维矩阵行列式的值,返回运算结果*/

{

int

i,j,k,l,s;

ElemType

**T1;

ElemType

**T2;

T1=CreateMatrix(n);

T2=CreateMatrix(n);

ElemType

u;

ElemType

value=0;

//运算结果

for(i=0;i

{

for(j=0;j

{

T1[i][j]=M[i][j];

T2[i][j]=M[i][j];

}

}

if(n==2)

//若为2维矩阵,则直接运算并返回运算结果

{

value=T2[0][0]*T2[1][1]-T2[0][1]*T2[1][0];

return

value;

}

else

{

for(j=0;j

//将矩阵的行列式以第一行展开

{

u=T1[0][j];

for(i=1,l=0;i

//求矩阵行列式的余子式M(0,j)

{

for(k=0,s=0;k

{

if(k==j)

continue;

else

{

T2[l][s]=T1[i][k];

s++;

}

}

l++;

}

value=value+u*((int)pow(-1,j))*MatrixDeterm(T2,n-1);

/*行列式等于某一行的各个元素与其代数余子式的乘积之和*/

}

return

value;

}

}

int

DinV(ElemType

**M,ElemType

**V)

/*全选主元法求矩阵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;i

for(j=0;j

V[i][j]=M[i][j];

for(k=0;k

{

d=0;

for(i=k;i

//找出矩阵M从M[k][k]开始绝对值最大的元素

{

for(j=k;j

{

if(fabs(V[i][j])>d)

{

d=fabs(V[i][j]);

//d记录绝对值最大的元素的值

/*把绝对值最大的元素在数组中的行、列坐标分别存入IS[K],JS[K]*/

IS[k]=i;

JS[k]=j;

}

}

}

if(d+1.0

==

1.0)

return

0;

//所有元素都为0

if(IS[k]

!=

k)

/*若绝对值最大的元素不在第k行,则将矩阵IS[K]行的元素与k行的元素相交换*/

for(j=0;j

swap(&V[k][j],&V[IS[k]][j]);

if(JS[k]!=k)

/*若绝对值最大的元素不在第k列,则将矩阵JS[K]列的元素与k列的元素相交换*/

for(i=0;i

swap(&V[i][k],&V[i][JS[k]]);

V[k][k]=1/V[k][k];

//绝对值最大的元素求倒

for(j=0;j

/*矩阵M第k行除元素M[k][k]本身外都乘以M[k][k]*/

if(j!=k)

V[k][j]=V[k][j]*V[k][k];

for(i=0;i

/*矩阵除第k行的所有元素与第k列的所有元素外,都拿本身减去M[i][k]*M[k][j],其中i,j为元素本身在矩阵的位置坐标*/

if(i!=k)

for(j=0;j

if(j!=k)

V[i][j]=V[i][j]-V[i][k]*V[k][j];

for(i=0;i

/*矩阵M第k列除元素M[k][k]本身外都乘以-M[k][k]*/

if(i!=k)

V[i][k]=-V[i][k]*V[k][k];

}

for(k=n-1;k>=0;k--)

/*根据上面记录的行IS[k],列JS[k]信息恢复元素*/

{

for(j=0;j

if(JS[k]!=k)

swap(&V[k][j],&V[JS[k]][j]);

for(i=0;i

if(IS[k]!=k)

swap(&V[i][k],&V[i][IS[k]]);

}

free(IS);

free(JS);

return

0;

}

void

MultMatrix(ElemType

**M1,ElemType

**M2,ElemType

**R)

/*矩阵M1乘M2

结果存入矩阵R*/

{

int

i,j,k;

for(i=0;i

{

for(j=0;j

{

R[i][j]=0;

}

}

for(i=0;i

{

for(j=0;j

{

for(k=0;k

{

R[i][j]=R[i][j]+M1[i][k]*M2[k][j];

}

}

}

}

void

Input(ElemType

**M)

//输入矩阵M的各个元素值

{

int

i,j;

char

str[10];

char

c='A';

if(flag==1)

c='B';

system(“cls“);

printf(“\n\n输入矩阵%c(%d*%d)\n“,c,n,n);

for(i=0;i

{

for(j=0;j

{

scanf(“%f“,*(M+i)+j);

}

}

flag=1;

gets(str);

//吸收多余的字符

}

void

Print(ElemType

**M)

//显示矩阵M的各个元素值

{

int

i,j;

printf(“\t“);

for(i=0;i

{

for(j=0;j

{

printf(“

%.3f“,M[i][j]);

}

puts(““);

printf(“\t\t“);

}

}

int

Menu_Select()

{

char

c;

do{

system(“cls“);

puts(“\t\t*************n维矩阵乘法器*************“);

puts(“\t\t|

1.通过键盘输入各项数据

|“);

puts(“\t\t|

2.显示矩阵A,B

|“);

puts(“\t\t|

3.矩阵求逆,并显示逆矩阵

|“);

puts(“\t\t|

4.求矩阵运算A*B,并显示运算结果

|“);

puts(“\t\t|

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

puts(“\t\t|

6.从文件读入矩阵A,B与维数n

|“);

puts(“\t\t|

0.退出

|“);

puts(“\t\t***************************************“);

printf(“\t\t请选择(0-6):“);

c=getchar();

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

return

(c-'0');

}

void

ReadFromFile()

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

{

int

i,j;

FILE

*fp;

if((fp=fopen(“tx.txt“,“r“))==NULL)

{

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

system(“pause“);

exit(0);

}

fscanf(fp,“%d“,&n);

//读入矩阵维数

A=CreateMatrix(n);

//创建矩阵A

B

V

R

B=CreateMatrix(n);

V=CreateMatrix(n);

R=CreateMatrix(n);

for(i=0;i

//读入矩阵A

{

for(j=0;j

{

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

}

}

for(i=0;i

//读入矩阵A

{

for(j=0;j

{

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

}

}

puts(“\n\n读文件成功“);

fclose(fp);

flag=1;

}

int

main()

{

int

i;

char

c,h;

char

str[10];

for(;;)

{

switch(Menu_Select())

{

case

1:

flag=-1;

for(;;)

{

system(“cls“);

printf(“\n\n\t矩阵维数n:“);

scanf(“%d“,&n);

gets(str);

if(n>0)

break;

else

{

printf(“\n\t输入有误,请重新输入!\n“);

puts(““);

system(“pause“);

}

}

A=CreateMatrix(n);

B=CreateMatrix(n);

V=CreateMatrix(n);

R=CreateMatrix(n);

Input(A);

Input(B);

break;

case

2:

system(“cls“);

if(flag==-1)

{

puts(“\n\n\t不存在任何矩阵数据,请先输入数据“);

system(“pause“);

break;

}

puts(“\n“);

printf(“\tA

=

“);

Print(A);

puts(“\n“);

printf(“\tB

=

“);

Print(B);

puts(““);

system(“pause“);

break;

case

3:

system(“cls“);

if(flag==-1)

{

puts(“\n\n\t不存在任何矩阵数据,请先输入数据“);

system(“pause“);

break;

}

for(;;)

{

printf(“\n\n\t输入需要求逆的矩阵(A/B):“);

h=getchar();

c=getchar();

//h=getchar();

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

{

i=DinV(A,V);

if(i==-1)

{

puts(“\n\n\t矩阵A的行列式等于0,不可逆!“);

system(“pause“);

break;

}

printf(“\tA

=

“);

Print(A);

puts(“\n“);

printf(“A^(-1)

=

“);

Print(V);

puts(““);

system(“pause“);

break;

}

else

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

{

i=DinV(B,V);

if(i==-1)

{

puts(“\n\n\t矩阵B的行列式等于0,不可逆!“);

system(“pause“);

break;

}

printf(“\tB

=

“);

Print(B);

puts(“\n“);

printf(“B^(-1)

=

“);

Print(V);

puts(““);

system(“pause“);

break;

}

else

puts(“\n\n\t输入有误,请重新输入!\n“);

}

break;

case

4:

system(“cls“);

if(flag==-1)

{

puts(“\n\n\t不存在任何矩阵数据,请先输入数据“);

system(“pause“);

break;

}

MultMatrix(A,B,R);

printf(“\n\n\tA*B

=

“);

Print(R);

puts(““);

system(“pause“);

break;

case

5:

system(“cls“);

if(flag==-1)

{

puts(“\n\n\t不存在任何矩阵数据,请先输入数据“);

system(“pause“);

break;

}

i=DinV(B,V);

if(i==-1)

{

puts(“\n\n\t矩阵B的行列式等于0,不可逆!“);

system(“pause“);

break;

}

MultMatrix(A,V,R);

printf(“\n\nA*B^(-1)

=

“);

Print(R);

puts(““);

system(“pause“);

break;

case

6:

system(“cls“);

ReadFromFile();

puts(““);

system(“pause“);

break;

case

0:

puts(“\t\t正常退出“);

exit(0);

break;

}

}

return

0;

}

六、运行结果

1.主界面:

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

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语言程序设计教程》

谭浩强

张基温

唐永炎

编著

高等教育出版社

《工程数学——线性代数

第四版》

同济大学应用数学系

高等教育出版社

计本

2007-12

第五篇:矩阵心得体会

《矩阵论》学习心得体会

2011-2012第一学期,我在李胜坤老师的引领下,逐步学习了科学出版社出版、徐仲和张凯院等编著的《矩阵论简明教程》第二版。该书是大学本科期间所学习的《线性代数》的矩阵部分内容的深化,从数域扩展到矩阵,要想充分理解“矩阵论”的精髓,就得先好好的将《线性代数》复习——掌握其基本概念及重要定理、结论。

该书有8个章节,第一章是矩阵的相似变换,第二章讲的是范数理论,第三章介绍的是矩阵分析,第四章详细介绍的是矩阵分解,第五章罗列的是特征值的估计与表示,第六章介绍的是广义逆矩阵,第七章介绍的是矩阵的直积,最后一章介绍的是线性空间与线性变换。下面分章节谈论。

第一章中的特征值与特征向量、矩阵的相似对角化、向量内积是本科期间《线性代数》中的内容,我想作者的目的是借助以前大家都熟悉的知识,将我们引领到另一个崭新的知识领域,起到承上启下的作用,让我们对《矩阵论》感到不陌生。该章中的Jordan标准形、Hamilton-Cayley定理、酉相似的标准形是本科期间不曾深入学习的知识,这些知识为后续学习《矩阵论》吹响了号角。总之,第一章就是高等数学中的知识与“矩阵论”的衔接章节,同时也是后续章节学习的非常重要基础章节。我们要学好《矩阵论》就得学好该章,理解记忆其中的概念、结论。

第二章介绍向量范数与矩阵范数及其应用。介绍了向量范数的三公理、酉不变性、1范、2范、无穷范、p范、加权范数(也叫椭圆范数)以及很重要的一个不等式——Cauchy-Schwarz不等式、向量的收敛、发散性;矩阵范数的定义、m1范、m无穷范、F范及其酉不变性,矩阵范数与向量范数的相容性等。范数与矩阵的谱半径紧紧相连,有了范数作为研究矩阵的数学工具,我们将会更易更深入的理解、研究矩阵,并用矩阵指导实际生产实践。

第三章矩阵分析和第四章矩阵分解各是矩阵论的最重要章节之一。通过对矩阵的收敛性、矩阵级数、矩阵函数、矩阵微分、矩阵积分、矩阵四种分解等系统性学习研究,让我明白了矩阵理论在实际生活中的巨大作用——矩阵论将大大减少工程运算量及提高计算速度、精度。有了矩阵理论作指导,现实生活中很多不能解决或者很难解决的数学问题等都能够得到很好的解决。比如,提高计算机的计算速度、优化数字信号处理算法等。

第五章介绍了矩阵的非常重要的参数——特征值的估计及其表示,介绍了特征值界定估计、特征值包含区域等,让我们对特征值有了更进一步的了解,用书中的方法可以很高效的确定特征值的范围、估计特征值的个数。是研究矩阵的有效方法,为计算特征值指明了方向,解决了以前计算特征值的困扰。

第六章介绍的是广义逆矩阵,是逆矩阵的推广。广义逆矩阵是将可逆的方阵推广到不可逆矩阵、长方矩阵。介绍了广义逆矩阵的概念、逆矩阵的应用、Moor-Penrose逆A+的计算、性质以及在解线性方程组中的应用。我想该章更大的应用应该在解线性方程组中,解决生活中的计算问题,提供了又一高效办法。

第七章矩阵的直积是很易懂的知识,是以前向量直积在矩阵中的推广。对矩阵直积的研究对信号处理与系统理论中的随机静态分析与随机向量过程分析等有重要的指导作用,同时也是重要的数学工具,是研究信号处理人员必备的数学工具。

第八章线性空间与线性变换,其中线性空间是几何空间与n维向量空间概念的推广与抽象,线性变换则反映了线性空间元素之间的一种最基本的联系。该章的学习需要我们充分发挥我们的空间想象能力,同时该章也将会大大的启迪我们思维的灵活性、唤醒沉睡已久的新思维。

通过《矩阵论简明教程》的学习,开阔了我的数学视野,给我思考问题、解决实际问题提供了新的思维方法。我将努力借助《矩阵论》,使自己在信号处理领域走的更远。

下载数据结构稀疏矩阵应用word格式文档
下载数据结构稀疏矩阵应用.doc
将本文档下载到自己电脑,方便修改和收藏,请勿使用迅雷等下载。
点此处下载文档

文档为doc格式


声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:645879355@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。

相关范文推荐

    矩阵分析

    第一章: 了解线性空间(不考证明),维数,基 9页:线性变换,定理1.3 13页:定理1.10,线性空间的内积,正交 要求:线性子空间(3条)非零,加法,数乘 35页,2491011 本章出两道题 第二章: 约旦标准型 相......

    树形结构的应用 数据结构实验

    树形结构应用 实验日志 实验题目:建立二叉树 实验目的:掌握二叉树的定义、性质及存储方式,各种遍历算法。 实验要求: 采用二叉树链表作为存储结构,完成二叉树的建立,先序、中序和......

    数字矩阵的特点及在高速公路监控的应用(合集)

    数字矩阵的特点及在高速公路监控的应用 视频矩阵概述 在视频监控系统中,视频矩阵最重要的一个功能就是实现对输入视频图像的切换输出,也就是将视频图像从任意一个输入通道切换......

    TRIZ理论之应用矛盾矩阵的步骤(大全)

    TRIZ理论之应用矛盾矩阵的步骤: 应用矛盾矩阵的步骤 应用矛盾矩阵解决工程问题时,建议使用一下16个步骤来进行。 (1)确定技术系统的名称。 (2)确定技术系统的主要功能。 (3)对技术......

    数据结构参考材料[范文大全]

    数据结构参考题目 一、选择 1.如果在数据结构中每个数据元素只可能有一个直接前驱,但可以有多个直接后继,则该结构是( ) A.栈 B.队列 C. 树 D.图 2.下面程序段的时间复杂度为( ) f......

    2数据结构-实验报告二(栈和队列及其应用)

    实验二 栈和队列及其应用 一、实验目的 1. 掌握栈和队列这两种抽象数据类型的特点,并能在相应的应用问题中正确选用它们。 2. 熟练掌握栈类型的两种实现方法。 3. 熟练掌握循......

    数据结构课程设计报告二叉树的应用操作

    数据结构课程设计报告 题目名称: 二叉树的应用问题 专业班级: 计算机科学与技术 学生姓名:学生学号:指导教师: 目录 一、题目要求 .................................................

    企业文化评估矩阵

    企业文化评估矩阵 企业文化评估矩阵概述 企业文化评估矩阵又称为企业文化诊断与评估系统(Corporate-Culture Measurement and Assessment System,CMAS),我国大部分企业文化研究......