#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, давал эту перестановку)