2017-11-28 45 views
2

Ich habe versucht, QR-Zerlegung Schritt für Schritt zu visualisieren, aber ich bekomme keine erwarteten Ergebnisse. Ich bin neu in numpy so, es wäre schön, wenn jeder Experte Auge erkennen konnte, was ich vielleicht fehlt:Matrix QR-Faktorisierungsalgorithmen

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] 

jede Hilfe die Tatsache klarzustellen, dass diese Zwischenergebnisse zeigen nicht die Eigenschaften, die sie eigentlich wird sehr empfangen werden

Danke !!

Antwort

1

NumPy ist entworfen, um mit homogenen mehrdimensionalen Arrays zu arbeiten, es ist nicht speziell eine lineare Algebra Paket. So ist der Operator * per Entwurf elementweise Multiplikation, nicht das Matrixprodukt.

Wenn Sie das Matrixprodukt erhalten möchten, gibt es ein paar Möglichkeiten:

  1. Sie np.matrix Objekte erstellen können, anstatt np.ndarray Objekte, für die der * Operator ist das Matrixprodukt.

  2. Sie können auch den Operator @ verwenden, wie in W_12 @ A, der das Matrixprodukt ist.

  3. Oder Sie können np.dot(W_12, A) oder W_12.dot(A) verwenden, die das Skalarprodukt berechnet.

Jeder dieser unter Verwendung der Daten, die Sie geben, gibt die folgende für Givens-Rotation:

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

Und dies für die Gram-Schmidt Schritt:

>>> (W1.dot(A))[:, 0] 
array([ 1.40000000e+01, -4.44089210e-16, 4.44089210e-16])