- 主题:请教一个幂迭代计算矩阵多个特征值的问题 (转载)
【 以下文字转载自 Mathematics 讨论区 】
发信人: aimto (目标), 信区: Mathematics
标 题: 请教一个幂迭代计算矩阵多个特征值的问题
发信站: 水木社区 (Thu May 5 11:03:22 2022), 站内
幂迭代一般求矩阵的最大特征值,和对应的特征向量。
我的问题是求3到6个特征值,以及对应的特征向量。当然,矩阵的维数在大约N*N,N大约在10到20之间。
我讲一下我的计算过程:
矩阵是一个复向量的自相关矩阵,记作R1(N*N),用幂迭代方法,计算出最大的特征值e1,对应的特征向量v1(1*N).
然后构造出第2个矩阵R2=R1-e1*v1'*v1。 '代表共轭转置。 这样R2的维数也是(N*N)。再用幂迭代的方法,计算出R2的最大特征值e2,以及对应的特征向量v2(1*N)。
以此类推,算出3个,或者最多6个特征值以及特征向量。或根据特征值得大小判断。
现在发现,唯一能够保证正确的,是e1和v1,和matlab自己计算出来的结果一样。其它e2,e3,v2,v3等等都不对。
是不是这种思路本身就有问题?
或者有别的方法,只计算部分特征值和特征向量。(主要是计算量的原因)
--
FROM 123.127.220.*
工程上,其实是商用CPU,需要在不超过10毫秒的时间内,计算出大约1000*500个这样的矩阵的特征值和特征向量。
【 在 sssss 的大作中提到: 】
: N这么小,都算出来也花不了太多时间
:
--
FROM 123.127.220.*
matlab的eigs函数,其实就是用的krylov分解,分解的方法还很多,都是迭代算法。
但是我跑了9000个10*10的对称矩阵,算其中6个基,耗的时间比eig计算10个基的时间还长。
感觉不合理啊
【 在 shookware 的大作中提到: 】
: 直接用krylov子空间类的方法不行么?
:
--
FROM 115.183.228.*
我对比了一下计算速度,特征值全计算,比幂迭代,耗时是幂迭代的2.4倍。
耗时这个指标对需求很严格。
【 在 youself 的大作中提到: 】
: 这矩阵很小啊,直接求所有本征值。上幂法没意义。
--
FROM 115.183.228.*
复向量的相关函数,对称正定复矩阵。
【 在 pasuka 的大作中提到: 】
: 对称或非对称?
: 实矩阵或复矩阵?
: 正定或半正定或非正定矩阵?
: ...................
--
FROM 115.183.228.*
也许是哪个环节没搞对。
【 在 cafitren 的大作中提到: 】
: 只要有现成的,最好还是不要自己搞,除非原理上能够快至少上百倍。
: 记得当年自己Fortran上编了个高斯消元法,用起来又慢还经常出错,最后还是用库省心。
:
--
FROM 115.183.228.*
krylov里面,好像有的方法就是反复幂迭代,算出其中几个特征值。
【 在 shookware 的大作中提到: 】
: 直接用krylov子空间类的方法不行么?
:
--
FROM 115.183.228.*