我想计算一个扩散核,其中涉及到 exp(b*A),其中 A 是一个大矩阵。为了使用 b 的值,我想将 A 对角化(以便 exp(A) 快速运行)。
我的矩阵大约是 25k x 25k,但是非常稀疏——只有大约 60k 的值是非零的。Matlab 的“eigs”函数耗尽内存,octave 的“eig”和 R 的“eigen”也是如此。是否有工具可以找到大型稀疏矩阵的分解?
不知道这是否相关,但 A 是邻接矩阵,所以它是对称的,并且是满秩的。
我想计算一个扩散核,其中涉及到 exp(b*A),其中 A 是一个大矩阵。为了使用 b 的值,我想将 A 对角化(以便 exp(A) 快速运行)。
我的矩阵大约是 25k x 25k,但是非常稀疏——只有大约 60k 的值是非零的。Matlab 的“eigs”函数耗尽内存,octave 的“eig”和 R 的“eigen”也是如此。是否有工具可以找到大型稀疏矩阵的分解?
不知道这是否相关,但 A 是邻接矩阵,所以它是对称的,并且是满秩的。
您是否尝试过 SVD,svds
用于 matlab 中的稀疏矩阵。
编辑:还有一件事,因为维度很大,所以不要做全等级 SVD,使用一个小等级,比如 500,这样你的解决方案就适合内存。这会将小特征值及其向量剔除。因此,它不会对您的准确性造成太大影响。
如果您可以访问 64 位机器和使用 64 位支持编译的 octave,您也许可以解决这个问题。
另外,我不知道您在哪个平台上运行所有这些,但是在基于 UNIX 的系统中,您可以使用ulimit
来增加用户进程的最大允许堆栈大小。
例如,您可以运行
ulimit -u unlimited
这将确保您的进程没有内存限制等。一般来说,这不是一个好主意,因为您有失控的进程,这会使您的机器完全陷入困境。试试吧
ulimit -s [stacksize]
增加堆栈大小限制。
您是否考虑过以下属性: exp(A*t) = L^(-1) {(sI-A)^(-1)} 其中 L^(-1) 是拉普拉斯逆变换?- 前提是您可以反转 (sI-A)
Octave 有 slu,它对稀疏矩阵进行 lu 分解。我不确定它是否可以处理 25k x 25k 但值得一试。
或者,如果您的矩阵结构如下: A = [B zeros;zeros C] 那么您可以分别对角化 B 和 C 并将它们放在一个矩阵中。我猜你可以为 eig 做类似的事情。