2010-06-24 2 views
1
예를 들어

의 인덱싱 문제는, 매트릭스가있다 :.ndarray

import numpy as np 
A = np.array([[ 8. , -6. , 2. ], 
       [-0.5, 8. , -6. ], 
       [ 0.5, -0.5, 2. ]]) 

그것은 LU 분해 (두리틀의 분해) 결과이다 (A = [L \ U]) 나는 L을 얻고 싶은
및 A.
에서 U U는해야한다 :

U = np.array([[ 8., -6., 2.], 
       [ 0., 8., -6.], 
       [ 0., 0., 2.]]) 

L가 있어야한다 :

L = np.array([[ 1. , 0. , 0. ], 
       [-0.5, 1. , 0. ], 
       [ 0.5, -0.5, 1.]]) 

그때 알고 싶습니다. L과 U를 어떻게 얻는 지 알고 싶습니까?

답변

2

색인 조작이 필요하지 않습니다. 그냥 tril, triuidentity 기능을 사용하여 :

import numpy as np 
A = np.array([[ 8. , -6. , 2. ], 
       [-0.5, 8. , -6. ], 
       [ 0.5, -0.5, 2. ]]) 

U = np.triu(A) 

#[[ 8. -6. 2.] 
# [-0. 8. -6.] 
# [ 0. -0. 2.]] 

L = np.tril(A, k=-1) + np.identity(3) 

#[[ 1. 0. 0. ] 
# [-0.5 1. 0. ] 
# [ 0.5 -0.5 1. ]] 
+0

은 매력처럼 작동합니다. – sunqiang

1

당신이 나에게 LU 분해처럼 http://en.wikipedia.org/wiki/LU_decomposition

>>> U_ = np.array([[ 8., -6., 2.], 
       [ 0., 8., -6.], 
       [ 0., 0., 2.]]) 
>>> L_ = np.array([[ 1. , 0. , 0. ], 
       [-0.5, 1. , 0. ], 
       [ 0.5, -0.5, 1.]]) 
>>> np.dot(L_, U_) 
array([[ 8., -6., 2.], 
     [ -4., 11., -7.], 
     [ 4., -7., 6.]]) 

LU 분해를 보이지 않는 원하는 것은 scipy.linalg에서 사용할 수

>>> A = np.array([[ 8. , -6. , 2. ], [-0.5, 8. , -6. ], [ 0.5, -0.5, 2. ]]) 
>>> import scipy.linalg as spla 
>>> P, L, U = spla.lu(A) 
>>> L 
array([[ 1.  , 0.  , 0.  ], 
     [-0.0625 , 1.  , 0.  ], 
     [ 0.0625 , -0.01639344, 1.  ]]) 
>>> U 
array([[ 8.  , -6.  , 2.  ], 
     [ 0.  , 7.625  , -5.875  ], 
     [ 0.  , 0.  , 1.77868852]]) 
>>> np.dot(L, U) 
array([[ 8. , -6. , 2. ], 
     [-0.5, 8. , -6. ], 
     [ 0.5, -0.5, 2. ]]) 
+0

@user333700 매우 명확한 강의에 감사드립니다. 내 깨진 영어를 유감스럽게 생각합니다. 사실, A는 이미 LU 분해 (Doolittle 분해)의 결과이며 A는 다른 LU 분해 함수 (scipy.linalg.lu가 아님)에서 반환 값으로 사용됩니다. L과 U를 [L \ U] 형식으로 저장합니다 (Aka, A). np.dpt (L, U)는 원본 Matrix를 출력합니다 (사용자의 np.dot (L_, U_)과 동일). – sunqiang

+0

LU 결과를 신중하게 충분히 읽지 못했을 것 같습니다. 죄송합니다. – user333700

+0

@ user333700, 만나서 반갑습니다. 도움에 감사드립니다. :) – sunqiang