2016-12-27 39 views
2

mockup = [3,5,nan,2,4,nan,10,nan];矩阵,提取索引向量和移动的NaN到端

而忽略了NaN的以降序我怎样才能进行排序这个矢量?产生的载体必须与mockup具有相同的长度,即我需要将所有的NaN放在最后。结果应该是这样的: mockupSorted = [10,5,4,3,2,NaN,NaN,NaN]

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

回答

5

您可以使用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; 
+0

此解决方案非常方便!非常感谢。 – Andi

+0

该解决方案在使用行向量时非常有效(正如我将其放在原始问题中)。但是,实际上我正在处理2D/3D矩阵,我需要将排序应用到每一行。但是,在连接索引和NaN值时存在维度问题。 请问您可以使用这个3D模型矩阵: 'mockup(:,:,1)= ... [100,100,100; ... 103,95,100; ... 101,85,100; ... 96,90,102]; (:,:,2)= ... [50,NaN,NaN; ... 47,NaN,40; ... 45,60,45; ... 47,65,45];' – Andi

+0

@Andi更复杂的矩阵只是使用我的第二个建议 – Suever