如何根据多个列一次对表进行排序?

时间:2017-12-26 11:20:13

标签: matlab sorting multiple-select matrix-indexing

我有16列的表,前三列是输入列。我想一次按照前三列对整张表进行排序。

T = table(a1, a2, a3, ..., a16)

所有a1a2a3都将按升序排序。
例如:

a1 = [6 3 9 6 3 9 6 5]' 
a2 = [7 8 2 3 7 7 6 7]' 
a3 = [9 2 3 3 4 3 7 4]'

输出应为:

a1 = [3 3 5 6 6 6 9 9]'
a2 = [7 8 7 3 6 7 2 7]'
a3 = [4 2 4 3 7 9 3 3]'

2 个答案:

答案 0 :(得分:1)

我认为您正在寻找的功能是排序。 e.g。

ans =
  8×3 table
    a1    a2    a3
    __    __    __
    3     7     4 
    3     8     2 
    5     7     4 
    6     3     3 
    6     6     7 
    6     7     9 
    9     2     3 
    9     7     3 

您提供要排序的列的向量。

这会给你

@AllArgsConstructor(suppressConstructorProperties = true)

,首先按第1列排序,然后按第2列排序,最后按第3列排序。

答案 1 :(得分:0)

如果我完全理解这个问题,我也不确定。如果我理解正确,您希望按第一列排序,如果第一列中有相同的值,请考虑第二列......

解决这个问题的一种方法(假设只有正值)就是像这样利用int / float / double的范围:

a1 = [6 3 9 6 3 9 6 5]';
a2 = [7 8 2 3 7 7 6 7]';
a3 = [9 2 3 3 4 3 7 4]';
[~,order] = sort((a1 * max(a2+1) + a2 ) * max(a3+1) + a3);

这会给你想要的结果:

[a1(order)'; a2(order)'; a3(order)']
 3     3     5     6     6     6     9     9
 7     8     7     3     6     7     2     7
 4     2     4     3     7     9     3     3

使用max(abs(...))可能会允许您使用负值。然而,这种方法是务实的但不太好,我认为......