现在的位置: 首页 > 综合 > 正文

矩阵的特征值问题——幂法与反幂法

2012年02月15日 ⁄ 综合 ⁄ 共 880字 ⁄ 字号 评论关闭

  最近一段时间写的程序需要解矩阵的特征值与特征向量,本来以为不是特别复杂的问题,由于问题规模比较大(矩阵大约需要15000*15000那么大,甚至更大)而且要计算的尽量快而变得异常复杂。当然用matlab是相当容易的,但要求使用C或者C++的程序......

  我尝试了几种不同的方法,已经把自己搞的快糊涂了,在这里分几次总结一下:

  最初的想法的使用幂法和反幂法来解,这也是因为对这样的方法不是很熟悉,其实用幂法与反幂法只能解距离某个特定点最近和最远的特征值(特殊情况就是特定点是0的时候,只能求最大和最小特征值)。在网上找了一下之后,觉得这个算法并不如何复杂,就自己写了一下,至于这个算法google一下幂法和反幂法,就可以找到很多,基本按照这样的思路就可以顺利的写下来。我把自己写的代码放在http://download.csdn.net/source/2836321其实里面没有特别的东西,而且反幂法的算法并不难,但是不同的处理方法时间效率是不同的,因为反幂法的算法过程中要频繁的解线性方程组,如果这个比较慢,那反幂法基本就没有什么价值了(这也是我后来放弃使用自己写的反幂法的原因之一)。我写的这个算法用做练习还可以,解规模小一些的矩阵也看不出什么,但要解大规模的矩阵是不靠谱的,因此写在这里也只是记录一下自己的这个工作。

  后来的时候我发现自己解的问题不是求一个普通大规模矩阵的特征值,而是解一个大规模稀疏矩阵的部分特征值。想到这个之后我简单查了一下资料,就觉得自己写一个这样的高效算法不太靠谱,首先这个算法就很复杂,而我也不是专门写这个的,只是用一下而已,因为靠谱的路就是去找一个好一点儿的C或者C++的库,使用它的高效的解特征值与特征向量的功能。

  

  顺便提一下MATLAB里的解特征值与特征向量的功能,解全部的特征值的函数是[v d]=eig(A),而MATLAB里也有可以解一部分特征值的函数,即eigs函数,而且也可以用来解广义特征值问题。而且MATLAB还是相当高效的,如果是稀疏矩阵的话会更快,能使用matlab的话确实能省不少的心。

抱歉!评论已关闭.