【问题标题】:Tool to diagonalize large matrices对角化大矩阵的工具
【发布时间】:2011-02-24 10:52:14
【问题描述】:

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

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

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

【问题讨论】:

    标签: matlab r matrix octave eigenvalue


    【解决方案1】:

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

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

    【讨论】:

    • 愚蠢的问题,但是一旦我有了 lu,我该如何使用它?我意识到det(A) = det(L)*det(U),所以它们的对角化之间一定有某种关系,但我不够聪明,看不出来。
    【解决方案2】:

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

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

    【讨论】:

    • @ A = USV'。 S 是一个对角线上有特征值的方阵。
    • +1 @duffymo:参见维基百科关于 svd 和特征值分解之间的关系。在任何情况下,OP 都要求 svd 对 A 进行对角化。
    • 我试过在我的身上这样做,它说“超出了最大变量大小”。不过,我的电脑并不是最顶级的,所以它可能是那里的问题,而不是 matlab。
    • @Xodarap。 Matlab 的 svds 并不是最好的。你也可以试试tedlab.mit.edu/~dr/SVDLIBC。开始时,您首先要确保 SVD 通过尝试小矩阵来完成您的工作。
    • @Yin - 这是个好主意,但你知道丢失了多少信息吗?我觉得因为这是一个邻接矩阵,并且行之间确实非常独立,因此仅找到 10% 的特征值(或其他)将丢失 90% 的信息。
    【解决方案3】:

    你考虑过following property: exp(A*t) = L^(-1) {(sI-A)^(-1)} L^(-1) 的拉普拉斯逆变换在哪里? - 前提是你可以反转(sI-A)

    【讨论】:

    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

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

      例如,你可以运行

      ulimit -u unlimited
      

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

      ulimit -s [stacksize]
      

      增加堆栈大小限制。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-13
        • 1970-01-01
        • 1970-01-01
        • 2016-12-03
        • 2019-06-23
        • 1970-01-01
        相关资源
        最近更新 更多