按降序排序数组,但最后保留NaNs

时间:2017-01-12 11:50:02

标签: arrays matlab sorting

我有一个数组:

Data = [10 20 30 50 40 60 NaN NaN 70 80; 1 2 3 4 5 6 7 8 9 10];

第一行代表数据,第二行包含第一行的索引。

我想按降序排列第一行,但使用正确的索引。

因此,我的输出应该像

N_Data = [80 70 60 50 40 30 20 10 NaN NaN; 10 9 6 4 5 3 2 1 8 7];

我并不关心NaNs所以可以从数组中删除它们N_Data

3 个答案:

答案 0 :(得分:3)

您可以按默认升序对数据的否定进行排序,这会自动将NaN值放在最后。然后,您可以否定结果以获取原始值

result = -sortrows(-Data.').'
%   80    70    60    50    40    30    20    10   NaN   NaN
%   10     9     6     4     5     3     2     1     8     7

如果您想删除NaN

result = result(:, any(isnan(result), 1));

答案 1 :(得分:2)

在这里,您可以找到两个选项,灵感来自适用于您的案例的this answers

public class Main
{
    public void Load_Condensed()
    {
         condensed1.Load(Paths[0]);
         condensed2.Load(Paths[1]);
         condensed3.Load(Paths[2]);
         condensed4.Load(Paths[3]);
         condensed5.Load(Paths[4]);
         condensed6.Load(Paths[5]);
    }

    private void exportToolStripMenuItem_Click(object sender, EventArgs e)
    {

        List<Condensed> Pokemon = new List<Condensed>
        {
            condensed1.Export(),
            condensed2.Export(),
            condensed3.Export(),
            condensed4.Export(),   //Loads all of the data from calling Export()
            condensed5.Export(),
            condensed6.Export()
        };

        Export(Condensed);  //Sends the data
    }
}
Paths[]

如果您不关心NaN,可以将选项缩短为:

%// Option 1
Data = [10 20 30 50 40 60 NaN NaN 70 80; 1 2 3 4 5 6 7 8 9 10]

Data(isnan(Data)) = -Inf;
N_Data = sortrows(Data.',-1).'
N_Data(isinf(N_Data)) = NaN

%// Option 2
Data = [10 20 30 50 40 60 NaN NaN 70 80; 1 2 3 4 5 6 7 8 9 10]

[sortedData, sortedIndices] = sort(Data(1,:),'descend')
N_Data = [sortedData; sortedIndices]
mask = isnan(sortedData)
N_Data = [ N_Data( :,~mask), N_Data( :, mask) ]

说明:

N_Data =

    80    70    60    50    40    30    20    10   NaN   NaN
    10     9     6     4     5     3     2     1     7     8
%// Option 1
Data(isnan(Data)) = -Inf;
N_Data = sortrows(Data.',-1).'
N_Data(:,isinf(N_Data(1,:))) = []

%// Option 2
[sortedData, sortedIndices] = sort(Data(1,:),'descend')
N_Data = [sortedData; sortedIndices]
N_Data = N_Data( :,~isnan(sortedData) )

答案 2 :(得分:1)

尝试使用sortrows(Data.',-1).'

它对行进行排序,您希望对列进行排序,因此.'-1选项用于降序。