Как Matlab сделать сортировку? - PullRequest
5 голосов
/ 07 сентября 2010

Как работает sort () в matlab?
Код в чистом matlab:
q - это массив: </p> <pre><code>q = -0.2461 2.9531 -15.8867 49.8750 -99.1172 125.8438 -99.1172 49.8750 -15.8867 2.9531 -0.2461

После q = sort(roots(q)) я получил:
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</p> <p> Ну вроде бы нормально работает!Затем в Python я использую (q такой же, как указано выше, это np.array): </p> <pre><code>import numpy as np q = np.sort(np.roots(q))

И я получил: </p> <pre><code>[ 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 ]

Ну ... Эти два результата кажутся разными в том смысле, что они сортируются по-разному, так в чем причины?я сделал что-то не так?Заранее спасибо!

Мой ответ:

</p> <pre><code>def sortComplex(complexList): complexList.sort(key=abs) # then sort by the angles, swap those in descending orders return complexList

Затем вызовите его в коде Python, отлично работает: p

1 Ответ

4 голосов
/ 08 сентября 2010

Из документации MATLAB для SORT :

Если A имеет сложные записи r и s, sort заказывает их согласно следующее правило: r появляется перед s в sort(A) если одно из следующих держать:

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

Другими словами, массив, имеющий сложные записи, сначала сортируется на основе абсолютного значения (т.е. комплексной величины) этих записей, а любые записи, имеющие одинаковое абсолютное значение, сортируются на основе их фазовые углы .

Python (то есть numpy) упорядочивает вещи по-разному. С документация, на которую ссылается Амро в своем комментарии :

Порядок сортировки комплексных чисел лексикографический. Если и реальный, и мнимые части не являются нан, то порядок определяется реальными частями кроме случаев, когда они равны, в которых В случае, если порядок определяется мнимые части.

Другими словами, массив, имеющий сложные записи, сначала сортируется на основе реального компонента записей, а любые записи, имеющие равные реальные компоненты, сортируются на основе их мнимых компонентов.

EDIT:

Если вы хотите воспроизвести непостоянное поведение в MATLAB, вы можете использовать функцию SORTROWS для создания индекса сортировки на основе real и мнимые компоненты записей массива, затем примените индекс сортировки к массиву комплексных значений:

>> 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          
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...