2015-02-03 2 views
3

모든 행렬은 기초를 회전하는 것만으로 위 또는 아래 삼각형 형태로 작성할 수 있습니다. 파이썬 (numpy)에 간단한 루틴이 있나요? 나는 그것을 발견 할 수 없었고 그런 일이 없다고 믿을 수 없다. 그것을 ilustrate하려면임의의 행렬의 위/아래 삼각형 형태 찾기 n * n - 파이썬

matrix = numpy.array([[a,b,c], 
         [d,e,f], 
         [g,h,i]]) 

문자 수레입니다

matrix2 = numpy.array([[z,0,0], 
         [y,x,0], 
         [v,u,t]]) 

합니다. 그렇다면이 변화를 만드는 방법, 단순히 숫자 b, c 및 f를 제로로 설정하는 것이 아니라 가장 간단한 방법으로 기초의 올바른 회전으로 만드는 것입니다.

감사합니다.

답변

5

당신은 Schur decomposition을 찾고 있습니다. Schur 분해는 행렬 AA = Q U Q^H으로 분해합니다. 여기에서 U은 위 삼각 행렬이며, Q은 유니 터리 행렬 (기본 회전에 영향을줍니다)이고 Q^HQ의 은닉 행렬입니다.

import numpy as np 
from scipy.linalg import schur 

a = np.array([[ 1., 2., 3.], [4., 5., 6.], [7., 8., 9.]]) 
u, q = schur(a) # q is the unitary matrix, u is upper triangular 

repr(u) 
# array([[ 1.61168440e+01, 4.89897949e+00, 1.58820582e-15], 
#  [ 0.00000000e+00, -1.11684397e+00, -1.11643184e-15], 
#  [ 0.00000000e+00, 0.00000000e+00, -1.30367773e-15]]) 
+0

제 경우에는 분해가 잘되지 않았습니다. 0이어야하는 한 개의 숫자는 0이 아니 었습니다. 하지만 제 경우에는 충분한 정밀도였습니다. – Addman

+0

[부동 소수점 문제] (http://stackoverflow.com/questions/6569528/python-float-to-int-conversion/6569657#6569657)이 될 수 있습니까? 매트릭스 회전은 일반적으로 정밀도의 손실을 수반합니다. 가능한 해결책은이 [질문] (http://stackoverflow.com/questions/14419290/set-very-low-values-to-zero-in-numpy)에 대한 답변을 참조하십시오. –

+0

네, 그게 사실이라고 생각합니다. 매우 작은 회전이 필요했기 때문에 단위 행렬의 요소는 작거나 하나에 가깝습니다. 그러나 내가 어떻게 그것이 지금 충분하다고 말했는지. 감사. – Addman