2017-03-01 51 views
0

我有一个数组称为,它具有2排56列(如所附的图像中示出)排序阵列并保持指数在MATLAB

array

的第一行表示值,而第二行表示每个值的索引。我想排序的第一行,但保持每个值的索引(我试图使用排序函数,但它不保留第二行中的每个值的索引)。 例如,让我们假设我有这样的矩阵

输入 X = [9 2 4 3 3 1 8 2]

我想要的输出如下所示 Y = [1 2 3 4 9; 1 2 8 3];

+1

可以使用'sortrows':'Y =调用sortRows(X ')'' – Adiel

+1

@Adiel调用sortRows产生错误的结果。你可以测试这个'x = [1 1 1 2 2 3; 1 2 1 4 7 1]' – rahnema1

+0

你的例子的输出有什么问题?你认为哪种方式“错误”?似乎OP不想保留一些原始顺序,或者他有任何重复顺序的重复值,特别是当它不能被定义为“错误”时,仅仅依赖于特定的情况。 – Adiel

回答

1

有一对夫妇的方式来实现这一目标:

[y1,I] = sort(x(1,:)) 

y2 = x(2,I) 

y = [ y1 ; y2 ] 

这基本上排序数据的第一行,并保存分类指数I,然后用那些获得“排序”第二行的索引,然后只加入它们

y = sortrows(x')' 

'运算符转换矩阵,它允许您使用sortrows,然后再次使用它来重新整形输出矩阵。

+0

呵呵,从来不知道分拣!有趣的是,没有sortcols相当于... – ConfusinglyCuriousTheThird

+0

sortrows产生错误的结果 – rahnema1

+1

你是什么意思错误的结果?它给了我预期的输出 –

1

您可以使用排序元素

[S,I]=sort(x(1,:)); 
result = [S;x(2,I)] 

的指数第一行排序,排序元素的索引来订购第二排。

结果

2 3 4 9 
1 2 8 3 
0

您可以直接从排序第一行获取索引。这些可以作为在X本身的参数:

x=[9 2 4 3 ;3 1 8 2 ]; 

%get the indices of the first row: 
[~,indices] = sort(x(1,:)) 

%return x in the order "indices" for each row: 
y = [x(1,indices);x(2,indices)] 
+1

您的解决方案是我的复制 – rahnema1

+0

我已经接受你的答案队友:) –