2

spluSuperLU を使用する によって計算されたスパース L および U 行列を出力するにはどうすればよいですか?

私の MWE:

>>> import scipy
>>> import scipy.sparse
>>> import scipy.sparse.linalg
>>> from numpy import array
>>> M = scipy.array([ [19,0,21,21,0],[12,21,0,0,0],[0,12,16,0,0],[0,0,0,5,21],[12,12,0,0,18] ])
>>> cscM = scipy.sparse.csc_matrix(M)
>>> lu_obj = scipy.sparse.linalg.splu(cscM)
>>> b = array([1, 2, 3, 4, 5])
>>> lu_obj.solve(b)
array([ 0.01245301,  0.08812209,  0.12140843, -0.08505639,  0.21072771])
4

2 に答える 2

2

lu_obj = scipy.sparse.linalg.splu(A) L,R = lu_obj.L, lu_obj.R csc 形式 ( scipy docs)でマトリックスを返す現在の scipy バージョンで使用できます 。

于 2015-06-04T07:39:09.330 に答える
2

scipy docssourceをざっと見てみると、 scipy.sparse.linalg.spluは確かに SuperLU を使用しています。SuperLU は L または U を明示的に計算しない可能性があるようです。L と U は、元のスパース行列よりも密度が高くなる傾向があるため、不要な場合は格納しないようにするのが理にかなっています。慰めになる場合は、lu_objL & U: の順列情報が含まれていますlu_obj.perm_c, lu_obj.perm_r

scipy.linalg.luL & Uを取得するには、LU 行列を取得するために使用するのが最小作業のパスです。ただし、疎行列を密行列に変換する必要があります。すなわち

P, L, U = scipy.linalg.lu(cscM.todense())
于 2013-05-25T06:46:47.750 に答える