我有一个非常大的稀疏矩阵A = 7Mi-by-7Mi矩阵。我正在使用Matlab的eigs(A,k)
函数,它可以计算出第一个k
特征值和向量。我需要它的所有特征向量和值。但我不能存储所有的特征向量,因为它需要大量的内存。
有没有办法(在Matlab或Python中)我可以在for
循环中逐个获取特征向量?即在ith
迭代中,我得到了ith
特征向量和值。
如果你对你正在寻找的特征值有多大的猜测,比如lambda_guess,你可以使用Power iteration
(A - lambda_guess* Id)^-1
这种方法有时被称为逆移方法。这里方法将收敛到最接近lambda_guess的特征值(你的猜测越好,收敛越快)。请注意,您不会存储逆,但只计算解的
x_next_iter = solve(A - lambda_guess*Id, x_iter)
,可能本身有一个迭代线性求解器。
我会将它与子空间迭代方法结合起来,子空间至少为2。这样,在第一次迭代中,您可以找到最小和第二小的特征值lambda1, lambda2
。
然后你可以尝试使用lambdaguess= lambda2+ epsilon
,使得输出的第一个和第二个特征向量分别对应于第二个和第三个最小特征值。(如果此迭代的第一个特征值与前一次迭代的lambda2值不同,则需要进行epsilon更小并重复。在实践中,你会测试它们的差异是否足够小,以解决舍入误差和迭代方法永远不会精确的事实)。你重复这个,直到你得到你正在寻找的特征值数字。它会很慢,但你只会在任何时候使用两个特征向量。
注意:我们假设所有特征值都是不同的,否则这个问题将不会有通常技术的低内存解决方案。一般来说,如果特征值的最大多重性是m
,那么你需要在内存中使用m
向量来进行子空间迭代收敛。