2016-12-27 41 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