2013-09-18 8 views
8

Obliczam wektory własne w Matlab i Numpy, ale uzyskując różne wyniki. Miałem wrażenie, że był tylko jeden zestaw wektorów własnych dla danej matrycy, jednak oba te wyjścia wydają się poprawne.Konfliktowe wyniki wektora własnego między Matlab i Numpy

Oto mój kod Matlaba:

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 zawiera:

eig_val = 
    0.1092   0 
      0 2.6668 

eig_vec zawiera:

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

Oto mój kod Python:

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 zawiera:

array([ 0.10923247, 2.66682217]) 

eig_vec zawiera:

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

Może ktoś wyjaśnić, dlaczego te wyjścia są różne, wydaje się, że każde dwa różne zestawy wektory własne są obracane wersje siebie. Czy jeden zestaw jest bardziej poprawny niż drugi?

+1

wektory własne nie są unikalne: http://stackoverflow.com/a/18152804/97160, ale myślę, że zarówno MATLAB, jak i NumPy polegają na tych samych procedurach LAPACK, aby je obliczyć, więc prawdopodobnie uzyskasz podobne wyniki. – Amro

+0

Zobacz [to starsze pytanie] (http://stackoverflow.com/questions/13041178/could-we-get-different-solutions-for-eigevectors--matrix/13041400 #14041400), aby uzyskać więcej informacji na temat - niepowtarzalność wektorów własnych (dotyczy matlab versus mathematica, ale w zasadzie jest to duplikat pytania) ... –

Odpowiedz

14

Nie jest to od razu oczywiste, ale zwrócone wektory własne są w obu przypadkach takie same. Spróbuj wykonać następujące czynności:

>>> 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]) 

Więc można uzyskać wektory własne matlab przez pomnożenie NumPy te przez -0.13-0.99j, to znaczy, że są współliniowe, a zatem samo ile wektory własne są zainteresowane.

+0

wow, dziękuję! Trudno mi było myśleć o "złożonych" kierunkach, ale teraz ma to sens. – mackuntu

Powiązane problemy