具有NaN元素的阵列的排序在其位置处保持完整

时间:2013-09-24 12:30:00

标签: matlab sorting

我有一个数组,想要在NaN完整的位置对其进行排序。


例如:

B=[5,2,NaN,NaN,9,34,23,NaN,89];

输出应为:

B_sorted=[2,5,NaN,NaN,9,23,34,NaN,89];

3 个答案:

答案 0 :(得分:1)

如果你在Ruby中这样做......

b=[5,2,'NaN','NaN',9,34,23,'NaN',89]

b_sort = (b - ['NaN']).sort
b = b.map{|x| x == 'NaN' ? 'NaN' : b_sort.shift}

答案 1 :(得分:1)

简单的解决方案是就地进行,而不是触摸NaN

元素
B=[5,2,NaN,NaN,9,34,23,NaN,89];
B(~isnan(B)) = sort(B(~isnan(B)))

或使用新数组:

B_sorted = nan(size(B));
B_sorted(~isnan(B)) = sort(B(~isnan(B)))

答案 2 :(得分:-1)

即使您为每个x定义compare(x,NaN)= 0,只使用不同的比较方法进行排序也不起作用。我认为合并排序和快速排序都会移动你的NaN。

我认为你需要过滤非NaN值,对它们进行排序,并覆盖非NaN指数。

在伪代码中

int j = 0;
for(int i= 0; i <= B.size(); ++i)
  if(B[i] != NaN)
     indices[j] = i
     values[j] = B[i]
     ++j

sort(values[0 .. j-1])

for(int k = 0; k < j; ++k)
  B[indices[k]]=values[k]