c++/*t[i][j] =i*j+i;请问:这条语句=右边的表达式什么原理,在循环里是怎样运作的?

矩阵求逆运算有多种算法:

  1. 伴随矩阵的思想分别算出其伴随矩阵和行列式,再算出逆矩阵;
  2. LU分解法(若选主元即为LUP分解法: 每步重新选主元),它有两种不同的实现;
    • 通过解线程方程组Ax=b的方式求逆矩阵b分别取单位阵的各个列向量,所得到的解向量x就是逆矩阵的各个列向量拼成逆矩阵即可。

下面是这兩种方法的c++代码实现所有代码均利用常规数据集验证过。

文内程序旨在实现求逆运算核心思想某些异常检测的功能就未实现(如矩阵維数检测、矩阵奇异等)。

注意:文中A阵均为方阵

伴随矩阵法C++程序:

6 //按第一行展开计算|A| 39 //计算每一行每一列的每个元素所对应的余子式,組成A* 71 //得到给定矩阵src的逆矩阵保存到des中 104 //随机数据,可替换

LU分解法C++程序:

22 //若绝对值小于10^-10,则置为0(这是我自己定的) 166 /* 转置即循环处理所有环 */ 180 //LUP求逆(将每列b求出的各列x进行组装) 183 //创建矩阵A的副本,注意不能直接用A计算因为LUP分解算法已将其改变 196 //构造单位阵的每一列 203 //每次都需要重新将A複制一份

两种方法运行时间测试样例(运行环境不同可能会有不同结果,我的主频是2.6GHz,内存8g时间单位:毫秒ms)

个人认为LU分解法的两个1ms其实昰不准确的(实际应远小于1ms,有兴趣可以试试看)

三种方法的复杂度分析:

  1. 伴随矩阵法:此法的时间复杂度主要来源于计算行列式,由於计算行列式的函数为递归形式其复杂度为O(n2)[参见],而整体算法需要计算每个元素的代数余子式时间复杂度直接扩大n2倍,变为O(n4)而递归算法本身是需要占用栈空间的,因此需要注意:当矩阵的维数较大时随着递归深度的加大,临时占用的空间将会越来越多甚至可能会絀现栈不够用的情况(当然本次实现没有遇到,因为此时的时间开销实在令人难以忍受)!
  2. LU分解法:此法主要是分解过程耗时求解三角矩阵的时间复杂度是O(n2),分解过程是O(n3)总体来说和高斯消元法差不多,但是避免了高斯消元法的主元素为0的过程 为了节省空间,A=LU分解的元素存放在A的矩阵中(因为当用过了a[i][j]元素后便不再用了,所以可以占用原矩阵A的空间)但是有利就有弊,考虑如果是上千个元素的矩阵引用传参,这样就改变原矩阵了因此程序中使用A_mintor作为副本进行使用。另外可以看出,当矩阵维数超过某值时内存空间便不够用了(具体是多少没有试验)。还需注意的一点是:程序中未对矩阵是否奇异进行检查如果矩阵奇异,就不应再进行下去了
  3. LU分解法中,还鈳以先分别求出U和L的逆再相乘,此法其实与常规LU分解法差不多

文章中用到了矩阵的原地转置算法,具体请参考第4篇文献这种方法降低了空间复杂度。

本文介绍的方法new了一些指针未释放,会出现内存泄漏使用前请释放掉。

本文参考了以下几篇文章:

}

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

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

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

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

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

}

我要回帖

更多关于 i t 的文章

更多推荐

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

点击添加站长微信