Matlab如何进行排序?

5
在Matlab中,sort()函数的工作原理是将数组按升序排序。以下是纯Matlab代码示例:
假设q是一个数组: sorted_q = sort(q);
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 看起来好像很顺利!然后在python中,我使用了如下代码 (q与上述相同,是一个np.array):
import numpy as np
q = np.sort(np.roots(q))

我得到的是:
[ 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        ]

嗯...这两个结果排序方式似乎不同,那么是什么原因呢?我做错了什么吗?提前谢谢!

我的回答:

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

然后在Python代码中调用它,就可以正常工作:p

2
尝试 roots(q)[ abs(roots(q)).argsort() ] - Amro
我刚试了一下(当然你需要导入正确的模块)。 - Amro
1个回答

4

SORT 的 MATLAB 文档中可以得知:

如果 A 包含复数元素 rs,则 sort 函数按照以下规则排序:rsort(A) 中出现在 s 之前,如果满足以下任意一条:

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

换句话说,具有复数元素的数组首先根据这些元素的绝对值(即复数大小)进行排序,然后根据它们的相位角进行排序。

Python(即numpy)对事物的排序方式有所不同。来自Amro在他的评论中提供的文档

复数的排序顺序是按字典顺序排列的。如果实部和虚部都不是NaN,则以实部为主,除非它们相等,在这种情况下,以虚部为主。

换句话说,具有复杂数组的数组首先基于条目的实部进行排序,并且任何具有相等实部的条目将基于其虚部进行排序。

编辑:

如果您想在MATLAB中复制numpy的行为,一种方法是使用SORTROWS函数根据数组条目的实数虚数部分创建排序索引,然后将该排序索引应用于您的复杂值数组:
>> 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          

@gnovice:啊哈,我明白了,但是np.sort(),它不是和Matlab中的sort()一样吗?你的回答是Matlab sort的文档,我不确定np.sort()是如何工作的? - serina
2
复数的排序顺序是词典排序。[...]:http://docs.scipy.org/doc/numpy/reference/generated/numpy.sort.html - Amro
@gnoivce:好的,我明白了,谢谢。那么这是否意味着我需要编写一个新的sort()函数来实现与matlab相同的目的?还是有另一个可以直接调用numpy的函数? - serina
@serina:我更新了我的答案,向您展示了在MATLAB中复制numpy行为的一种方法。 - gnovice

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接