MATLAB是如何排序的?

5 投票
1 回答
1394 浏览
提问于 2025-04-16 03:49

在Matlab中,sort()是怎么工作的呢?
这里有一段纯Matlab的代码:
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

1 个回答

4

根据MATLAB的文档,关于SORT函数:

如果数组A里有复数元素rs,那么sort会按照以下规则来排序:如果满足以下任一条件,r会排在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          

撰写回答