2010-09-07 20 views
5

Come funziona sort() in MATLAB?
Codice in puro MATLAB:
q è un array: come si fa matlab?

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

Dopo q = sort(roots(q)), ho ottenuto:
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

Beh, sembra funzionare bene! Poi in python, io uso (q è lo stesso come sopra, si tratta di un np.array):

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

ed ho ottenuto:

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

Beh ... Questi due risultati sembrano diverse in quanto specie in modo diverso , quindi quali sono le ragioni? ho fatto qualcosa di sbagliato? Grazie in anticipo!

La mia risposta:

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

Poi lo chiamano nel codice python, funziona bene: p

+2

provare 'radici (q)' – Amro

+0

@Amro [ABS (radici (q)) argsort().]: no, non lo farà lavoro – serina

+0

L'ho appena provato .. (ovviamente è necessario importare il file moduli adeguati) – Amro

risposta

4

Dalla documentazione MATLAB per SORT:

Se A ha voci complesse r e s , sort li ordina in base alla seguente regola: r appare prima s in sort(A) se una delle seguenti stiva:

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

In altre parole, una matrice che contiene voci complesse viene dapprima filtrate basa su absolute value (es ampiezza complessa) di tali voci e tutte le voci con lo stesso valore assoluto vengono ordinate in base al numero phase angles.

Python (cioè numpy) ordina le cose in modo diverso. Da the documentation Amro linked to in his comment:

L'ordinamento per numeri complessi è lessicografico. Se entrambe le parti immaginarie reali e non sono nan, l'ordine è determinato dalle parti reali eccetto quando sono uguali, in cui il caso è determinato dall'origine delle parti immaginarie .

In altre parole, un array con voci complesse viene innanzitutto ordinato in base al componente reale delle voci e le voci con componenti reali uguali vengono ordinate in base ai componenti immaginari.

EDIT:

Se si vuole riprodurre il comportamento NumPy in MATLAB, in un modo che si può fare è quello di utilizzare la funzione SORTROWS per creare un indice sorta basata sui componenti della matrice real e imaginary le voci, quindi applicare tale indice di ordinamento per l'array di valori complessi:

>> 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, ho capito, ma np.sort(), non era lo stesso di sort() in matlab? la tua risposta è il doc per matlab sort, non sono sicuro di cosa funzioni np.sort()? – serina

+2

"L'ordinamento per numeri complessi è lessicografico. [...]": http://docs.scipy.org/doc/numpy/reference/generated/numpy.sort.html – Amro

+0

@Amro: Ho capito, grazie – serina