我正试图在scipy稀疏矩阵上应用Colamd(列近似最小度置换(。
从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:Factor is exactly singular"。
A = csc_matrix([[0,1,0], [0,2,1], [0,3,0]])
总之,我正在python中搜索一个colamd代码/算法,其工作方式与colamd(S(matlab方法类似(即使用奇异矩阵(。我无法从python调用matlab代码。
谢谢
不确定这是否会给你同样的确切解决方案(因为我不清楚AMD/COLAMD有多稳定(;但我可以通过添加一个小的ε单位矩阵使a正定,得到一个解。当你把epsilon做得很小(例如机器epsilon(时,我希望能得到一些合理的解决方案。
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之外,几乎任何正ε都会给出这种排列(