用 NaNs 对矩阵进行排序,提取索引向量并将 NaNs 移到最后
Sort matrix with NaNs, extract index vectors and move NaNs to the end
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]
可以使用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;
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]
可以使用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;