2010-09-07 8 views
5

Jak działa sort() w programie Matlab?
kod w czystej Matlab:
q jest tablicą: jak matlab robi sortowanie?

q = -0.2461 2.9531 -15.8867 49.8750 -99.1172 125.8438 -99.1172 
49.8750 -15.8867 2.9531 -0.2461 

Po q = sort(roots(q)), mam:
q = 0.3525 0.3371 - 0.1564i 0.3371 + 0.1564i 0.2694 - 0.3547i 0.2694 + 0.3547i 1.3579 - 1.7880i 1.3579 + 1.7880i 2.4410 - 1.1324i 2.4410 + 1.1324i 2.8365

Cóż, wydaje się działać prawidłowo! Następnie w python, używam (q jest taka sama jak powyżej, jest to np.array):

import numpy as np 
q = np.sort(np.roots(q)) 

I mam:

[ 0.26937874-0.35469815j 0.26937874+0.35469815j 0.33711562-0.15638427j 
0.33711562+0.15638427j 0.35254298+0.j   1.35792218-1.78801226j 
1.35792218+1.78801226j 2.44104520-1.13237431j 2.44104520+1.13237431j 
2.83653354+0.j  ] 

Cóż ... Te dwa wyniki różnią się wydawać, że porządek inaczej , więc jakie są tego powody? czy zrobiłem coś złego? z góry dziękuję!

Moja odpowiedź:

def sortComplex(complexList): 
    complexList.sort(key=abs) 
    # then sort by the angles, swap those in descending orders 
    return complexList 

Następnie nazwać to w kodzie Pythona, działa dobrze: p

+2

spróbuj 'korzeni (q)' – Amro

+0

@Amro [aBS (korzenie (q)) argsort().]: nie, to nie będzie praca – serina

+0

Po prostu wypróbowałem to (oczywiście musisz zaimportować właściwe moduły) – Amro

Odpowiedz

4

Z dokumentacji MATLAB dla SORT:

Jeśli A ma złożone wpisy r i s , sort zamawia je zgodnie z następującą zasadą: r pojawia się przed s w sort(A) jeśli którekolwiek z poniższych przytrzymanie: najpierw sortowane według

  • abs(r) < abs(s)
  • abs(r) = abs(s) i angle(r) < angle(s)

Innymi słowy, tablica, która ma złożone wpisy na absolute value (tj złożona wielkość) tych pozycji, a wszystkie pozycje, które mają tę samą wartość bezwzględną, są sortowane na podstawie ich phase angles.

Python (np. Numpy) porządkuje sprawy inaczej. Od the documentation Amro linked to in his comment:

Kolejność sortowania liczb zespolonych jest leksykograficzny. Jeżeli obie części wyobrażone są rzeczywiste i nie są nanami, wówczas kolejność określona jest przez rzeczywiste części , z wyjątkiem sytuacji, gdy są one równe, przy czym kolejność jest określona przez części urojone.

Innymi słowy, matryca, która ma złożone pozycji najpierw sortowane na podstawie składowej rzeczywistej wpisami i jakiekolwiek dane, które mają takie same rzeczywiste komponenty są klasyfikowane w oparciu o ich urojonych.

EDIT:

Jeśli chcesz odtworzyć numpy zachowanie w programie MATLAB, jeden sposób można to zrobić jest użycie funkcji SORTROWS aby utworzyć indeks sortowania w oparciu o elementy składowe tablicy real i imaginary wpisy, a następnie zastosować ten wskaźnik do sortowania tablicy złożonych wartości:

>> r = roots(q); %# Compute your roots 
>> [junk,index] = sortrows([real(r) imag(r)],[1 2]); %# Sort based on real, 
                 %# then imaginary parts 
>> r = r(index) %# Apply the sort index to r 

r = 

    0.2694 - 0.3547i 
    0.2694 + 0.3547i 
    0.3369 - 0.1564i 
    0.3369 + 0.1564i 
    0.3528   
    1.3579 - 1.7879i 
    1.3579 + 1.7879i 
    2.4419 - 1.1332i 
    2.4419 + 1.1332i 
    2.8344   
+0

@ gnovice: aha, mam to, ale np.sort(), czy to nie to samo co sort() w Matlabie? twoja odpowiedź jest dokumentem dla sortowania matlab, nie jestem pewien co działa funkcja np.sort()? – serina

+2

"Kolejność sortowania liczb zespolonych jest leksykograficzna. [...]": http://docs.scipy.org/doc/numpy/reference/generated/numpy.sort.html – Amro

+0

@Amro: Rozumiem, dziękuję – serina