求两道两个矩阵相加后求行列式式

因为在删除一条边时矩阵只有一荇上的两个值发生变化将上述法则代入该行即可。

}

免责声明:本页面内容均来源于鼡户站内编辑发布部分信息来源互联网,并不意味着本站赞同其观点或者证实其内容的真实性如涉及版权等问题,请立即联系客服进荇更改或删除保证您的合法权益。

}

专业文档是百度文库认证用户/机構上传的专业性文档文库VIP用户或购买专业文档下载特权礼包的其他会员用户可用专业文档下载特权免费下载专业文档。只要带有以下“專业文档”标识的文档便是该类文档

VIP免费文档是特定的一类共享文档,会员用户可以免费随意获取非会员用户需要消耗下载券/积分获取。只要带有以下“VIP免费文档”标识的文档便是该类文档

VIP专享8折文档是特定的一类付费文档,会员用户可以通过设定价的8折获取非会員用户需要原价获取。只要带有以下“VIP专享8折优惠”标识的文档便是该类文档

付费文档是百度文库认证用户/机构上传的专业性文档,需偠文库用户支付人民币获取具体价格由上传人自由设定。只要带有以下“付费文档”标识的文档便是该类文档

共享文档是百度文库用戶免费上传的可与其他用户免费共享的文档,具体共享方式由上传人自由设定只要带有以下“共享文档”标识的文档便是该类文档。

}

最近高等代数正好讲到这里此篇文章正好对所学知识做一个具体程序实践。

设计算法时使用递归的思想是一个程序员的基本素质递归可以把一个很庞大的问题转化为規模缩小了的同类问题的子问题,通过这一思想我们编程时运用递归可以使用很少的代码来处理很大的问题。这篇文章将会讲到递归算法的运用

在数学中,很多数学函数都是由一个公式来表达的比如 f(x) = 100x; 这个公式可以让我们把长度米转换成长度厘米。 有了这个公式在程序中敲出一行代码,写出一个函数(function)来计算实在是太简单方便了就像这样。

我们就写好了一个函数来进行米到厘米的单位换算

但是囿的时候,数学函数会以不太标准的形式来定义比如这个函数,他满足 f(0)=0而且 f(x) = 2f(x-1)+x; 从这个函数定义我们可以得出 f(1)=1;f(2)=3;等等当一个函数用他自己来萣义时就称为这个函数是递归的。

通俗地讲就是从前有个山,山里有个庙庙里有个老和尚再给小和尚讲故事,讲的是:从前有个山屾里有个庙,庙里有个老和尚再给小和尚讲故事。。这就是递归

好了说了这么多你们肯定还是一头雾水,现在来实践一下

刚开始學编程的同学一定会写求阶乘的函数,使用for循环或者while循环都可以但是递归却完全用不上这两个循环。

上面的代码就是递归求阶乘的方法a是需要传入的参数,比如我们要求5的阶乘就传入5这样factorial函数最终的返回值为120;

分析这段代码他的第3行到第五行处理了 基准情况(Base Case),在這个情况下函数的值可以直接算出而不用求出递归。就像上文提到的函数f(x) = 2f(x-1)+x;如果没有f(0)=0这个事实在数学上没有意义一样 再编程中,如果没囿基准情况也是无意义的第7行执行的是递归调用。

所以所设计递归算法,需要包含以下两个基本法则:

1、基准情形(Base Case)必须总要有某些基准的清醒,在这个情形中不执行递归就能求解。

2、不断推进(Making Progress)对于需要递归求解的情形,递归调用必须总能够朝着一个基准凊形推进这样的话,不断推进到基准情形到达基准情形的时候递归才会推出,得到返回值

有了刚在知识的铺垫,现在我们可以动手寫一个程序来用递归计算n阶矩阵的两个矩阵相加后求行列式式了

首先来看下二阶矩阵的求法

也就是说2×2矩阵的元素交叉相乘再想减即鈳求出两个矩阵相加后求行列式式。

3×3矩阵求解中选择任意行或者列,在那一行/列中,移除那个元素所在的行和列比如选择a11则移除第一荇和第一列,这样矩阵就变成了2×2的再按照刚才的方法求2×2矩阵的两个矩阵相加后求行列式式即可。之后整个行或列的3个元素进行此类運算后相加就是3×3的两个矩阵相加后求行列式式

n阶矩阵就和3阶矩阵求解的方法一样了,使用3×3求解的方法比如4阶矩阵,将4阶消除成3阶然后再变成2阶来算。但是矩阵每上升一个维度计算量就会扩大很多。

知道了n阶矩阵两个矩阵相加后求行列式式的计算思路后就可以開始编写算法了。

首先是数据结构设计我们需要设计一个矩阵类来提供便利,这个类有两个成员一个二维数组,用来储存矩阵一个整数,来储存矩阵的行数或列数(两个矩阵相加后求行列式式必须是方矩阵才可以求解所以两个矩阵相加后求行列式无所谓)

以下是整個Matrix类的设计:

Matrix类中有两个构造方法:传入整数a会初始化一个axa大小的空矩阵,传入一个二维数组的话即可根据二维初始化一个Matrix对象

Matrix类中有┅个方法比较特殊:addElement方法,通过不断调用这个函数即可向一个Matrix实例进行有顺序的负值第一次调用则会更改第第一行第一列位置上的值,苐二次调用则会更改第一行第二列上的值以此类推。

接下来就是设计一个MatrixCalculator类的这个类中的一个成员方法可以求出两个矩阵相加后求行列式式,我命名他为getDet(); 在计算两个矩阵相加后求行列式式的时候需要移除元素所在的行和列生成一个减小了一个维度的矩阵,我们需要编寫一个方法来完成这个操作我命名他为removeRowAndCol();还有一个方法,由于相加的时候会产生符号的改变所以需要写一个方法来计算矩阵中一个元素的cofactor,命名为getCofactor

以下就是removeRowAndCol方法的代码:传入需要移除的行和列和一个Matrix对象,函数会返回消除了指定行和列的Matrix对象

以下是getCofactor方法:由于我的算法只会去遍历矩阵第一列来进行求解,所以得到Cofactor的代码就变得简单很多

接下来就是核心的递归求解两个矩阵相加后求行列式式的算法叻,先理一下思路递归算法的两个要素:基准情形,不断推进

对于n阶矩阵什么是基准情形呢?就是矩阵被降为2×2维度的时候直接返囙交叉相乘的差即可,不断推进如果是一个4阶矩阵,算法会先把4将为3×3矩阵然后3×3再拆成3个2×2矩阵来达到基准情形来算出答案,就和峩们手算两个矩阵相加后求行列式式时用到的方法一样手算时候也遵循这一算法。

只有不到20行代码但是却可以解决nxn的矩阵,是不是很鉮奇这就是递归的优势,把一个很庞大的问题转化为规模缩小了的同类问题的子问题来求解n阶矩阵最后被降为若干个2×2矩阵。

加上适當的输出语句来求解一个3阶矩阵两个矩阵相加后求行列式式试一下:

但是有一个问题需要注意,就是这个算法的复杂度

这个算法的复雜度为O(n!), 这意味着他的运行速度很慢,随着问题规模的增长时间会大幅度增长。在我的电脑上计算3×3到7×7内规模的矩阵,电脑都可以秒算出来但是如果是一个10×10的矩阵,电脑需要54秒钟到了11×11时间将会变得更长,下图是这个算法随着问题规模增长对运行时产生影响的曲線

可以看出7×7矩阵需要递归517次,到了10×10需要大约260万次递归运算才能得到结果可见问题规模增长后时间的开销是十分巨大的。

}

要求矩阵两个矩阵相加后求行列式式需要通过初等变换使得矩阵变为三角矩阵,然后对角线元素之积就是矩阵两个矩阵相加后求行列式式的值但是一般的初等变换可能导致浮点数的产生从而影响精度。因此这里使用辗转相除法进行初等变换

本算法是将其转化为上三角矩阵。因此从第一行开始处理苐 i行 时,要将第 (i+1) 行到第 n 行的第 i 列的元素转化为 0 这样处理完成后就是上三角矩阵了。

行处理第 j 行时,考虑两个元素 aiiaji 我们需要将 aji 转化為 0 ,对于两个数进行辗转相除后我们可以将一个元素转化为零另一个元素转化为非零。每一次辗转相除会导致矩阵的两行发生交换根據矩阵两个矩阵相加后求行列式式性质,每次操作结束后

本题多了个取模的部分。

}

我要回帖

更多关于 两个矩阵相加后求行列式 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信