Как применить алгоритм colamd к разреженной матрице в python?

#python #matlab #sparse-matrix #singular

#python #matlab #разреженная матрица #единственное число

Вопрос:

Я пытаюсь применить Colamd (перестановку минимальной степени столбца) к разреженной матрице scipy.

Неполное решение можно найти в документе scipy:

 from scipy.sparse import csc_matrix, linalg as sla
A = csc_matrix([[1,2,0,4],[1,0,0,1],[1,0,2,1],[2,2,1,0.]])
lu = sla.splu(A,permc_spec = 'COLAMD')
print(lu.perm_c)
  

Однако, если A является сингулярной матрицей, как показано ниже, возникает «Python Scipy.sparse RuntimeError: фактор точно сингулярен».

 A = csc_matrix([[0,1,0], [0,2,1], [0,3,0]])
  

Подводя итог, я ищу код / алгоритм colamd в python, работающий так, как работает метод colamd (S) matlab (т. Е. С сингулярной матрицей).
Я не могу вызвать код matlab из python.

Спасибо

Ответ №1:

Не уверен, что это даст вам такое же точное решение (поскольку мне неясно, насколько стабильна AMD / COLAMD); но я смог получить решение, добавив небольшую матрицу эпсилон-идентичности, чтобы получить положительное определение. Поскольку вы делаете эпсилон маленьким (например, машинный эпсилон), я ожидаю получить какое-то разумное решение.

 epsilon=1e-6
from scipy.sparse import csc_matrix, linalg as sla
A = csc_matrix([[0,1,0], [0,2,1], [0,3,0]]) epsilon*csc_matrix(np.eye(3))
lu = sla.splu(A,permc_spec = 'COLAMD')
print(lu.perm_c)

> [0 1 2]
  

(обратите внимание на ваш пример проблемы; практически любой положительный эпсилон, отличный от 1.0, давал эту перестановку)