2017-11-28 2 views
2

QR 분해를 단계별로 시각화하려고했지만 예상 결과를 얻지 못했습니다. 그것이 좋은 것, 그래서 어떤 전문가의 눈은 내가 누락 될 수 있습니다 무엇을 발견 할 수 있다면 나는 NumPy와 새로운 해요 :매트릭스 QR 인수 분해 알고리즘

import numpy as np 
from scipy import linalg 

A = np.array([[12, -51, 4], 
[6, 167, -68], 
[-4, 24, -41]]) 

#Givens 

v = np.array([12, 6]) 

vnorm = np.linalg.norm(v) 

W_12 = np.array([[v[0]/vnorm, v[1]/vnorm, 0], 
       [-v[1]/vnorm, v[0]/vnorm, 0], 
       [0, 0, 1]]) 

W_12 * A #this should return a matrix such that [1,0] = 0 

#gram-schmidt 

A[:,0] 

v = np.linalg.norm(A[:,0]) * np.array([1, 0, 0]) 

u = (A[:,0] - v) 

u = u/np.linalg.norm(u) 

W1 = np.eye(3) - 2 * np.outer(u, u.transpose()) 

W1 * A #this matrix's first column should look like [a, 0, 0] 

이 중간 결과 그들이 생각하는 속성을 보여주지 않는다는 사실을 명확히 도움 ~을 (를) 크게 받게됩니다.

감사합니다.

답변

1

NumPy는 동질의 다차원 배열로 작동하도록 설계되었지만 특별히 선형 대수 패키지가 아닙니다. 따라서 설계 상 * 연산자는 요소 - 와이드 행렬 곱이 아닌 곱셈입니다. 당신은 매트릭스 제품을 얻고 싶은 경우에

, 몇 가지 방법이 있습니다

  1. 당신은의 * 운영자 매트릭스 제품으로하는 것이 아니라 np.ndarray 개체를 np.matrix 개체를 만들 수 있습니다.

  2. 매트릭스 제품인 W_12 @ A에서와 같이 @ 연산자를 사용할 수도 있습니다.

  3. 또는 내적을 계산하는 np.dot(W_12, A) 또는 W_12.dot(A)을 사용할 수 있습니다.

    >>> (W1.dot(A))[:, 0] 
    array([ 1.40000000e+01, -4.44089210e-16, 4.44089210e-16]) 
    
    : 그람 - 슈미트 단계에 대한

    >>> np.dot(W_12 A)[1, 0] 
    -2.2204460492503131e-16 
    

    그리고이 :

당신이주는 데이터를 사용하여 다음 중 어느 하나의 기븐스 회전에 대해 다음을 반환