scipy 如何计算稀疏矩阵的矩阵指数?

cclgggtu  于 2023-02-04  发布在  其他
关注(0)|答案(1)|浏览(233)

我在求一个稀疏矩阵的矩阵指数:

import numpy as np

b = np.array([[1, 0, 1, 0, 1, 0, 1, 1, 1, 0],
       [1, 0, 0, 0, 1, 1, 0, 1, 1, 0],
       [0, 1, 1, 0, 1, 1, 0, 0, 1, 1],
       [0, 0, 0, 0, 0, 1, 1, 1, 0, 0],
       [1, 1, 0, 0, 0, 0, 1, 0, 0, 0],
       [0, 0, 1, 0, 0, 1, 0, 0, 1, 1],
       [0, 0, 1, 0, 1, 0, 1, 1, 0, 0],
       [1, 0, 0, 0, 1, 1, 0, 0, 1, 1],
       [0, 0, 0, 0, 1, 0, 1, 1, 1, 0],
       [0, 0, 0, 1, 0, 1, 1, 0, 0, 1]])

我可以使用scipy.linalg.expm来计算,但是对于较大的矩阵来说速度很慢。

from scipy.linalg import expm

S1 = expm(b)

由于这是一个稀疏矩阵,我尝试将b转换为scipy.sparse矩阵,并对转换后的稀疏矩阵调用该函数:

import scipy.sparse as sp
import numpy as np

sp_b = sp.csr_matrix(b)
S1 = expm(sp_b);

但我得到了以下错误:

loop of ufunc does not support argument 0 of type csr_matrix which has no callable exp method

如何计算稀疏矩阵的矩阵指数?

mcvgt66p

mcvgt66p1#

对于稀疏矩阵,需要使用scipy.sparse.linalg.expm,而不是scipy.linalg.expm

import scipy.sparse as sp
from scipy.sparse.linalg import expm
import numpy as np

b = np.array([[1, 0, 1, 0, 1, 0, 1, 1, 1, 0],
       [1, 0, 0, 0, 1, 1, 0, 1, 1, 0],
       [0, 1, 1, 0, 1, 1, 0, 0, 1, 1],
       [0, 0, 0, 0, 0, 1, 1, 1, 0, 0],
       [1, 1, 0, 0, 0, 0, 1, 0, 0, 0],
       [0, 0, 1, 0, 0, 1, 0, 0, 1, 1],
       [0, 0, 1, 0, 1, 0, 1, 1, 0, 0],
       [1, 0, 0, 0, 1, 1, 0, 0, 1, 1],
       [0, 0, 0, 0, 1, 0, 1, 1, 1, 0],
       [0, 0, 0, 1, 0, 1, 1, 0, 0, 1]])
sp_b = sp.csr_matrix(b)
S1 = expm(sp_b);

注意:正如您所发现的,将矩阵定义为CSR matrix会发出警告 “SparseEfficiencyWarning:spsolve在sparse B采用CSC矩阵格式”“时效率更高。要消除这种情况,可以按照警告的建议进行操作,并定义一个CSC matrix(如果这对您的应用程序有意义的话):

sp_b = sp.csc_matrix(b)

相关问题