【问题标题】:Matrix power for sparse matrix in pythonpython中稀疏矩阵的矩阵幂
【发布时间】:2015-04-26 11:12:09
【问题描述】:

我正在尝试找到一种方法来对稀疏矩阵 M 进行矩阵幂:M^k = M*...*M k 次,其中 * 是矩阵乘法 (numpy.dot),并且 不是元素乘法

我知道如何处理普通矩阵:

import numpy as np
import scipy as sp
N=100
k=3
M=(sp.sparse.spdiags(np.ones(N), 0, N, N)-sp.sparse.spdiags(np.ones(N), 2, N, N)).toarray()
np.matrix_power(M,k)

稀疏的M怎么办:

M=(sp.sparse.spdiags(np.ones(N), 0, N, N)-sp.sparse.spdiags(np.ones(N), 2, N, N))

当然,我可以通过递归乘法来做到这一点,但我想知道在 scipy 中是否有类似 matrix_power 的功能用于稀疏矩阵。 非常感谢任何帮助。提前致谢。

【问题讨论】:

    标签: python numpy scipy linear-algebra sparse-matrix


    【解决方案1】:

    ** 已为csr_matrix 实施。有一个__pow__ 方法。

    在处理了一些特殊情况后,__pow__ 会:

                tmp = self.__pow__(other//2)
                if (other % 2):
                    return self * tmp * tmp
                else:
                    return tmp * tmp
    

    对于稀疏矩阵,* 是矩阵乘积(dot 用于 ndarray)。所以它在做递归乘法。


    正如math 所指出的,np.matrix 还实现了** (__pow__) 作为矩阵幂。事实上,它最终会调用np.linalg.matrix_power

    np.linalg.matrix_power(M, n) 是用 Python 编写的,因此您可以轻松查看它的作用。

    对于n<=3 只是重复dot

    对于较大的n,它会进行二进制分解以减少dots 的总数。我认为这意味着n=4

    result = np.dot(M,M)
    result = np.dot(result,result)
    

    稀疏版本没有那么普遍。它只能处理正整数幂。

    您不能指望numpy 函数在备用矩阵上运行。起作用的是将动作传递给数组自己的方法的那些。例如np.sum(A) 打电话给A.sum()

    【讨论】:

    【解决方案2】:

    您也可以使用** 表示法而不是matrix_power 来表示numpy 矩阵:

    a=np.matrix([[1,2],[2,1]])
    a**3
    

    出来:

    matrix([[13, 14],
            [14, 13]])
    

    用 scipy 稀疏矩阵试试。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-02
      • 2021-12-07
      • 2011-11-20
      • 2023-04-10
      • 2018-01-19
      • 2021-02-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多