4

我想计算一个扩散核,其中涉及到 exp(b*A),其中 A 是一个大矩阵。为了使用 b 的值,我想将 A 对角化(以便 exp(A) 快速运行)。

我的矩阵大约是 25k x 25k,但是非常稀疏——只有大约 60k 的值是非零的。Matlab 的“eigs”函数耗尽内存,octave 的“eig”和 R 的“eigen”也是如此。是否有工具可以找到大型稀疏矩阵的分解?

不知道这是否相关,但 A 是邻接矩阵,所以它是对称的,并且是满秩的。

4

5 回答 5

2

您是否尝试过 SVD,svds用于 matlab 中的稀疏矩阵。

编辑:还有一件事,因为维度很大,所以不要做全等级 SVD,使用一个小等级,比如 500,这样你的解决方案就适合内存。这会将小特征值及其向量剔除。因此,它不会对您的准确性造成太大影响。

于 2010-05-27T00:27:40.720 回答
1

如果您可以访问 64 位机器和使用 64 位支持编译的 octave,您也许可以解决这个问题。

另外,我不知道您在哪个平台上运行所有这些,但是在基于 UNIX 的系统中,您可以使用ulimit来增加用户进程的最大允许堆栈大小。

例如,您可以运行

ulimit -u unlimited

这将确保您的进程没有内存限制等。一般来说,这不是一个好主意,因为您有失控的进程,这会使您的机器完全陷入困境。试试吧

ulimit -s [stacksize]

增加堆栈大小限制。

于 2010-06-27T02:11:05.137 回答
1

您是否考虑过以下属性: exp(A*t) = L^(-1) {(sI-A)^(-1)} 其中 L^(-1) 是拉普拉斯逆变换?- 前提是您可以反转 (sI-A)

于 2010-05-27T07:12:12.800 回答
0

在 R 中,您可以检查igraph 包和函数arpack,它是ARPACK 库的接口。

于 2010-05-28T22:21:26.457 回答
0

Octave 有 slu,它对稀疏矩阵进行 lu 分解。我不确定它是否可以处理 25k x 25k 但值得一试。

或者,如果您的矩阵结构如下: A = [B zeros;zeros C] 那么您可以分别对角化 B 和 C 并将它们放在一个矩阵中。我猜你可以为 eig 做类似的事情。

于 2010-05-27T00:25:33.053 回答