Почему же scipy.linalg.lu () не возвращает ту же L-матрицу, что и scipy.sparse.linalg.splu ()? - PullRequest
0 голосов
/ 07 декабря 2018

У меня есть следующий фрагмент кода, где я вычисляю L-матрицу данной квадратной матрицы с помощью команды scipy.linalg.lu (), а затем снова делаю то же самое, за исключением того, что применяюсь к разреженной форме данной матрицыиспользуя scipy.sparse.linalg.splu ().Это код:

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.]]

Как мы видим, эти матрицы не совпадают.Я неправильно понимаю, что делают обе команды, или что-то не так?Любая помощь приветствуется.Спасибо!

1 Ответ

0 голосов
/ 07 декабря 2018

Я думаю, что ответ здесь заключается в том, что для декомпозиции "SuperLU" разреженной матрицы требуются перестановки как строк, так и столбцов (см. документы ):

Pr * A * Pc = L * U

Этообеспечивается отображением индексов в атрибутах perm_r и perm_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.

...