2013-09-18 13 views
8

Ich berechne Eigenvektoren in Matlab und Numpy, aber erziele unterschiedliche Ergebnisse. Ich hatte den Eindruck, dass es für eine gegebene Matrix nur eine Menge von Eigenvektoren gab, jedoch scheinen beide Ausgaben gültig zu sein.Widersprüchliche Eigenvektorausgaben zwischen Matlab und Numpy

Hier ist mein Matlab-Code:

m = [ 1.4675 + 0.0000i 0.1669 + 1.2654i; 
     0.1669 - 1.2654i 1.3085 + 0.0000i] 
[eig_vec,eig_val] = eig(m) 

eig_val enthält:

eig_val = 
    0.1092   0 
      0 2.6668 

eig_vec enthält:

eig_vec = 
     0.0896 + 0.6789i 0.0953 + 0.7225i 
    -0.7288 + 0.0000i 0.6848 + 0.0000i 

Hier meine Python-Code ist:

m = np.array([[1.46753694+0.j,   0.16692111+1.26535838j], 
       [0.16692111-1.26535838j, 1.30851770+0.j]]) 
eig_val,eig_vec = linalg.eigh(m) 

eig_val enthält:

array([ 0.10923247, 2.66682217]) 

eig_vec enthält:

array([[-0.68477170+0.j  , -0.72875765+0.j  ], 
     [ 0.09530915-0.72249836j, -0.08955653+0.67889021j]]) 

Kann mir jemand erklären, warum diese Ausgänge unterschiedlich sind, so scheint es, jeder wie die zwei verschiedene Sätze von Eigenvektoren sind gedrehten Versionen voneinander. Ist der eine Satz richtiger der andere?

+1

Eigenvektoren sind nicht eindeutig: http://Stackoverflow.com/a/18152804/97160, aber ich denke, sowohl MATLAB als auch NumPy verlassen sich auf die gleichen LAPACK Routinen, um sie zu berechnen, so dass Sie wahrscheinlich ähnliche Ergebnisse erhalten werden. – Amro

+0

Siehe [diese ältere Frage] (http://stackoverflow.com/questions/13041178/could-we-get-different-solutions-for-eigenvectors-from-a-matrix/13041400#13041400) für mehr lesen auf der nicht -Einheitlichkeit der Eigenvektoren (bezieht sich auf Matlab versus Mathematica, ist aber ansonsten im Wesentlichen eine doppelte Frage) ... –

Antwort

14

Es ist nicht sofort offensichtlich, aber die Eigenvektoren, die Sie zurückgeben, sind in beiden Fällen gleich. Versuchen Sie Folgendes:

>>> matlab_eigvec = np.array([[0.0896+0.6789j, 0.0953+0.7225j], 
...       [-0.7288+0.j, 0.6848+0.j]]) 
>>> 
>>> f1, f2 = matlab_eigvec.T # matlab eigenvectors 
>>> e1, e2 = eig_vec.T # numpy eigenvectors 
>>> f1/e1 
array([-0.13084653-0.99142531j, -0.13079065-0.99146862j]) 
>>> f2/e2 
array([-0.13077050-0.99141326j, -0.13078845-0.99145198j]) 

So können Sie die Matlab Eigenvektoren erhalten, indem die numpy diejenigen von -0.13-0.99j multipliziert, das heißt sie sind kollinear und damit die gleiche soweit Eigenvektoren betroffen sind.

+0

wow thanks! Es war schwer für mich, über "komplexe" Richtungen nachzudenken, aber es macht jetzt total Sinn. – mackuntu

Verwandte Themen