为什么scipy.linalg.lu()不返回与scipy.s稀疏.linalg.spla()相同的L矩阵



我有以下代码,其中我使用命令scipy.linalg.lu((计算给定平方矩阵的L矩阵,然后我再次执行相同的操作,只是使用scipy.s稀疏.linalg.sspl((应用于给定矩阵的稀疏形式。这是代码:

import numpy as np
from scipy.sparse.linalg import splu
from scipy.sparse import csc_matrix
import scipy.linalg
A1 = csc_matrix([[1., 0, 0.], [5., 0, 2], [0, -1., 0]])
A2 = np.array([[1., 0, 0.], [5., 0, 2], [0, -1., 0]])
B = splu(A1)
P,L,U = scipy.linalg.lu(A2)
print(L);print(csr_matrix.todense(B.L))

返回以下内容:

[[ 1.   0.   0. ]
[ 0.   1.   0. ]
[ 0.2 -0.   1. ]]
[[1. 0. 0.]
[0. 1. 0.]
[0. 0. 1.]]

正如我们所看到的,这些矩阵并不相同。我是误解了这两个命令的作用,还是出了其他问题?感谢您的帮助。谢谢

我认为这里的答案是稀疏矩阵的"SuperLU"分解需要行和列的排列(请参阅文档(:

Pr * A * Pc = L * U

这些是由perm_rperm_c属性中的索引的映射提供的。所以,

Pr = csc_matrix((3,3))
Pr[B.perm_r, np.arange(3)] = 1
Pc = csc_matrix((3,3))
Pc[np.arange(3), B.perm_c] = 1
(Pr.T @ B.U @ B.L @ Pc.T).A

根据需要提供:

array([[ 1.,  0.,  0.],
[ 5.,  0.,  2.],
[ 0., -1.,  0.]])

这与只需要L矩阵P @ L @ U的置换的非稀疏结果相同。

相关内容

  • 没有找到相关文章

最新更新