【发布时间】:2019-04-25 12:38:56
【问题描述】:
我有一个非常大的稀疏矩阵 A = 7Mi-by-7Mi 矩阵。我正在使用 Matlab 的 eigs(A,k) 函数,它可以首先计算 k 特征值和向量。
我需要它的所有特征向量和值。但是我不能存储所有的特征向量,因为它需要大量的内存。
有什么方法(在 Matlab 或 Python 中)可以在 for 循环中一一获取特征向量?即在ith 迭代中,我得到ith 特征向量和值。
【问题讨论】:
-
大多数(如果不是全部)计算特征值/向量的算法从最大到最小的特征值工作; MATLAB 的
eigs()确实做到了这一点。您必须找到一种不依赖于先前计算的特征值的算法,然后循环遍历。 (或者当然购买更多的内存)。此外,要求 7M 特征值听起来像 XY problem,如果您告诉我们您需要它们的用途,我们可能会告诉您根本不需要它们,但需要替代解决方案。 -
@Adriaan 在 eigs.m 文件中,使用的算法似乎是 Krylov-Schur。它真的需要所有先前计算的特征值来计算下一个或只计算一些吗?如果没有,可以按照此处的要求进行操作。
-
我认为这是不可能的。特征值取决于整个矩阵,您需要整个矩阵来计算每个。如果你裁剪一条线,特征值就会改变。
-
你看过
numpy.linalg.eig()吗?也许您可以在您的问题中添加为什么这不是一种有前途的方法(问题应始终包含有关已经尝试过的事物以及它们失败的原因的信息)。 -
我猜这里的诀窍是原始稀疏矩阵只适合内存,因为它太稀疏了。也许计算特征向量的所有中间步骤也只产生非常稀疏的矩阵,因此,如果你让算法使用相同的稀疏矩阵类型,你可以计算出内存中的所有特征向量吗?
标签: python algorithm matlab math eigenvalue