【问题标题】:Sort matrix with NaNs, extract index vectors and move NaNs to the end使用 NaN 对矩阵进行排序,提取索引向量并将 NaN 移动到末尾
【发布时间】:2017-05-11 21:48:15
【问题描述】:

mockup = [3,5,nan,2,4,nan,10,nan];

如何在忽略 NaN 的情况下按降序对该向量进行排序?结果向量的长度必须与mockup 相同,即我需要将所有 NaN 放在最后。结果应该是这样的: mockupSorted = [10,5,4,3,2,NaN,NaN,NaN]

实际上,我对各个索引感兴趣,即sort 函数的第二个输出向量。所以,我正在寻找 mockupSortedIdx = [7,2,5,1,4,NaN,NaN,NaN]

【问题讨论】:

    标签: matlab sorting nan


    【解决方案1】:

    您可以使用sort的两个输出,然后使用isnan修改两个输出的顺序。

    [vals, inds] = sort(mockup, 'descend');
    
    bool = isnan(vals);
    
    mocksorted = [vals(~bool), vals(bool)];
    %    10     5     4     3     2   NaN   NaN   NaN
    
    mocksortedind = [inds(~bool), vals(bool)];
    %     7     2     5     1     4   NaN   NaN   NaN
    

    另一种选择是使用ascend 排序并仅对mockup 的负数进行排序,因为ascend 排序会将NaN 值放在末尾。

    [vals, inds] = sort(-mockup);
    
    mocksorted = -vals;
    mocksortedind = inds;
    

    【讨论】:

    • 这个解决方案非常好用!非常感谢。
    • 该解决方案在使用行向量时效果很好(正如我在原始问题中所说的那样)。然而,实际上我正在使用 2D/3D 矩阵,我需要将排序应用于每一行。但是在连接索引和 NaN 值时存在维度问题。您能否使用这个 3D 模型矩阵:mockup(:,:,1) = ... [100, 100, 100; ... 103, 95, 100; ... 101, 85, 100; ... 96, 90, 102]; mockup(:,:,2) = ... [50, NaN, NaN; ... 47, NaN, 40; ... 45, 60, 45; ... 47, 65, 45];
    • @Andi 对于更复杂的矩阵只需使用我的第二个建议
    猜你喜欢
    • 1970-01-01
    • 2018-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-29
    • 2015-04-21
    相关资源
    最近更新 更多