Main Content

sortrows

对矩阵行或表行进行排序

说明

示例

B = sortrows(A) 基于第一列中的元素按升序对矩阵行进行排序。当第一列包含重复的元素时,sortrows 会根据下一列中的值进行排序,并对后续的相等值重复此行为。

示例

B = sortrows(A,column) 基于向量 column 中指定的列对 A 进行排序。例如,sortrows(A,4) 会基于第四列中的元素按升序对 A 的行进行排序。sortrows(A,[4 6]) 首先基于第四列中的元素,然后基于第六列中的元素,对 A 的行进行排序。

示例

对于上述任意语法,B = sortrows(___,direction) 均按 direction 指定的顺序对 A 的行进行排序。direction 可以是 'ascend'(默认值,对于升序排序)或 'descend'(对于降序排序)。direction 也可以是元素为 'ascend''descend' 的元胞数组,其中每个元素对应于 sortrows 对其进行运算的一个列。例如,sortrows(A,[4 6],{'ascend' 'descend'}) 基于第四列按升序对 A 的行进行排序,然后基于第六列按降序排序。

示例

B = sortrows(___,Name,Value) 指定用于对行进行排序的其他参数。例如,sortrows(A,'ComparisonMethod','abs') 按模对 A 的元素进行排序。

示例

[B,index] = sortrows(___) 还会返回描述行的重新排列的索引向量,以便 B = A(index,:)

示例

tblB = sortrows(tblA) 对表或时间表中的行进行排序。

  • 如果 tblA 是表,则 sortrows 基于第一个变量中的值对 tblA 进行升序排序。如果第一个变量中的元素重复,则 sortrows 按第二个变量中的元素排序,依此类推。

  • 如果 tblA 是时间表,则 sortrows 将基于行时间按升序对 tblA 中的行进行排序。但是,这些行仅基于行时间进行排序。如果行时间重复,则 sortrows 不会按时间表变量中的元素排序。

    时间表的行时间是 datetimeduration 值,它们沿时间表的第一个维度标记行。

示例

tblB = sortrows(tblA,'RowNames') 基于表的行名称对表进行排序。表的行名称沿表的第一个维度标记行。如果 tblA 不包含行名称,即,tblA.Properties.RowNames 为空,则 sortrows 返回 tblA

tblA 是时间表时,不支持此语法。

示例

tblB = sortrows(tblA,rowDimName) 沿第一个维度按行标签 rowDimNametblA 进行排序。

  • 如果 tblA 是表,则行标签为行名称。

  • 如果 tblA 是时间表,则行标签为行时间。

示例

tblB = sortrows(tblA,vars)vars 指定的变量中的元素对表进行排序。例如,sortrows(tblA,{'Var1','Var2'}) 首先基于 Var1 中的元素,然后基于 Var2 中的元素对 tblA 的行进行排序。

  • 如果 tblA 是包含行名称的表,则 vars 可以包含行名称。

  • 如果 tblA 是时间表,则 vars 可以包括行时间。

示例

对于上述任意表语法,tblB = sortrows(___,direction) 按照 direction 指定的顺序对 tblA 进行排序。direction 可以是 'ascend''descend',它应用于 sortrows 对其执行运算的所有指定的变量、行名称或行时间。direction 也可以是元素为 'ascend''descend' 的元胞数组,其中每个元素对应于要排序的指定变量、行名称或行时间。

示例

tblB = sortrows(___,Name,Value) 指定用于对表或时间表的行进行排序的其他参数。例如,sortrows(tblA,'Var1','MissingPlacement','first') 基于 Var1 中的元素进行排序,将 NaN 等缺失的元素排在表的开头。

示例

[tblB,index] = sortrows(___) 还返回一个索引向量以使 tblB = tblA(index,:)

示例

全部折叠

创建矩阵,并基于第一列中的元素按升序对矩阵行进行排序。当第一列包含重复的元素时,sortrows 会基于第二列中的元素进行排序。对于第二列中的重复元素,sortrows 会基于第三列进行排序,依此类推。

rng default;
A = floor(rand([6 7])*100);
A(1:4,1) = 95;  A(5:6,1) = 76;  A(2:4,2) = 7;  A(3,3) = 48
A = 6×7

    95    27    95    79    67    70    69
    95     7    48    95    75     3    31
    95     7    48    65    74    27    95
    95     7    14     3    39     4     3
    76    15    42    84    65     9    43
    76    97    91    93    17    82    38

B = sortrows(A) 
B = 6×7

    76    15    42    84    65     9    43
    76    97    91    93    17    82    38
    95     7    14     3    39     4     3
    95     7    48    65    74    27    95
    95     7    48    95    75     3    31
    95    27    95    79    67    70    69

基于第二列中的值对 A 的行排序。当指定的列包含重复元素时,对应的行将保持其原始顺序。

C = sortrows(A,2)
C = 6×7

    95     7    48    95    75     3    31
    95     7    48    65    74    27    95
    95     7    14     3    39     4     3
    76    15    42    84    65     9    43
    95    27    95    79    67    70    69
    76    97    91    93    17    82    38

基于第一列中的元素对 A 的行进行排序,如果第一列中包含相同元素,则按第七列进行排序。

D = sortrows(A,[1 7])
D = 6×7

    76    97    91    93    17    82    38
    76    15    42    84    65     9    43
    95     7    14     3    39     4     3
    95     7    48    95    75     3    31
    95    27    95    79    67    70    69
    95     7    48    65    74    27    95

基于第四列中的元素以降序对 A 的行进行排序,并显示输出向量 index 以查看行是如何重新排列的。

[E,index] = sortrows(A,4,'descend')
E = 6×7

    95     7    48    95    75     3    31
    76    97    91    93    17    82    38
    76    15    42    84    65     9    43
    95    27    95    79    67    70    69
    95     7    48    65    74    27    95
    95     7    14     3    39     4     3

index = 6×1

     2
     6
     5
     1
     3
     4

创建一个包含复数的矩阵,并基于第一列中的元素按升序对矩阵行进行排序。由于 A(1,1)A(3,1) 的模相等,因此 sortrows 会计算它们的角度以进行排序。

A = [1+2i 3+i i; 2+10i 6i 2+5i; 2+i 4 3+3i]
A = 3×3 complex

   1.0000 + 2.0000i   3.0000 + 1.0000i   0.0000 + 1.0000i
   2.0000 +10.0000i   0.0000 + 6.0000i   2.0000 + 5.0000i
   2.0000 + 1.0000i   4.0000 + 0.0000i   3.0000 + 3.0000i

B = sortrows(A)
B = 3×3 complex

   2.0000 + 1.0000i   4.0000 + 0.0000i   3.0000 + 3.0000i
   1.0000 + 2.0000i   3.0000 + 1.0000i   0.0000 + 1.0000i
   2.0000 +10.0000i   0.0000 + 6.0000i   2.0000 + 5.0000i

angle(A(1,1))
ans = 1.1071
angle(A(3,1))
ans = 0.4636

可使用 'real' 选项按 A 行的实部对这些行进行排序。由于 A(2,1)A(3,1) 具有相同的实部,sortrows 将使用虚部进行排序。

C = sortrows(A,'ComparisonMethod','real')
C = 3×3 complex

   1.0000 + 2.0000i   3.0000 + 1.0000i   0.0000 + 1.0000i
   2.0000 + 1.0000i   4.0000 + 0.0000i   3.0000 + 3.0000i
   2.0000 +10.0000i   0.0000 + 6.0000i   2.0000 + 5.0000i

imag(A(2,1))
ans = 10
imag(A(3,1))
ans = 1

创建一个 6×2 字符向量元胞数组,并对其行进行排序。结果是一个同时按国家/地区和名称排序的字母顺序列表。

A = {'Germany' 'Lukas'; 'USA' 'William'; 'USA' 'Andrew'; ...
'Germany' 'Andreas'; 'USA' 'Olivia'; 'Germany' 'Julia'} 
A = 6x2 cell
    {'Germany'}    {'Lukas'  }
    {'USA'    }    {'William'}
    {'USA'    }    {'Andrew' }
    {'Germany'}    {'Andreas'}
    {'USA'    }    {'Olivia' }
    {'Germany'}    {'Julia'  }

B = sortrows(A)
B = 6x2 cell
    {'Germany'}    {'Andreas'}
    {'Germany'}    {'Julia'  }
    {'Germany'}    {'Lukas'  }
    {'USA'    }    {'Andrew' }
    {'USA'    }    {'Olivia' }
    {'USA'    }    {'William'}

按照降序顺序,先对国家/地区进行排序,然后对名称进行排序。

C = sortrows(A,[1 2],{'ascend' 'descend'})
C = 6x2 cell
    {'Germany'}    {'Lukas'  }
    {'Germany'}    {'Julia'  }
    {'Germany'}    {'Andreas'}
    {'USA'    }    {'William'}
    {'USA'    }    {'Olivia' }
    {'USA'    }    {'Andrew' }

按变量值对表行进行排序。

创建一个表,其中包含列出五位病患信息的四个变量。

LastName = {'Smith';'Johnson';'Williams';'Jones';'Brown'};
Age = [38;43;38;40;49];
Height = [71;69;64;67;64];
Weight = [176;163;131;133;119];
BloodPressure = [124 93; 109 77; 125 83; 117 75; 122 80];

tblA = table(Age,Height,Weight,BloodPressure,'RowNames',LastName)
tblA=5×4 table
                Age    Height    Weight    BloodPressure
                ___    ______    ______    _____________

    Smith       38       71       176       124     93  
    Johnson     43       69       163       109     77  
    Williams    38       64       131       125     83  
    Jones       40       67       133       117     75  
    Brown       49       64       119       122     80  

对该表的行排序。sortrows 函数首先按变量 Age 以升序对行进行排序,然后按变量 Height 对具有相等年龄的两行进行排序。

tblB = sortrows(tblA)
tblB=5×4 table
                Age    Height    Weight    BloodPressure
                ___    ______    ______    _____________

    Williams    38       64       131       125     83  
    Smith       38       71       176       124     93  
    Jones       40       67       133       117     75  
    Johnson     43       69       163       109     77  
    Brown       49       64       119       122     80  

创建一个表,其中包含列出五位病患信息的四个变量。

LastName = {'Smith';'Johnson';'Williams';'Jones';'Brown'};
Age = [38;43;38;40;49];
Height = [71;69;64;67;64];
Weight = [176;163;131;133;119];
BloodPressure = [124 93; 109 77; 125 83; 117 75; 122 80];

tblA = table(Age,Height,Weight,BloodPressure,'RowNames',LastName)
tblA=5×4 table
                Age    Height    Weight    BloodPressure
                ___    ______    ______    _____________

    Smith       38       71       176       124     93  
    Johnson     43       69       163       109     77  
    Williams    38       64       131       125     83  
    Jones       40       67       133       117     75  
    Brown       49       64       119       122     80  

基于行名称按升序对表行进行排序,并返回描述行重新排列方式的索引向量。

[tblB,index] = sortrows(tblA,'RowNames')
tblB=5×4 table
                Age    Height    Weight    BloodPressure
                ___    ______    ______    _____________

    Brown       49       64       119       122     80  
    Johnson     43       69       163       109     77  
    Jones       40       67       133       117     75  
    Smith       38       71       176       124     93  
    Williams    38       64       131       125     83  

index = 5×1

     5
     2
     4
     1
     3

创建一个表,其中包含列出五位病患信息的四个变量。

LastName = {'Sweet';'Jacobson';'Wang';'Joiner';'Berger'};
Age = [38;43;38;40;49];
Height = [71;69;64;67;64];
Weight = [176;163;131;133;119];
BloodPressure = [124 93; 109 77; 125 83; 117 75; 122 80];

tblA = table(Age,Height,Weight,BloodPressure,'RowNames',LastName)
tblA=5×4 table
                Age    Height    Weight    BloodPressure
                ___    ______    ______    _____________

    Sweet       38       71       176       124     93  
    Jacobson    43       69       163       109     77  
    Wang        38       64       131       125     83  
    Joiner      40       67       133       117     75  
    Berger      49       64       119       122     80  

Height 以升序对表行排序,然后按 Weight 以降序排序。

tblB = sortrows(tblA,{'Height','Weight'},{'ascend','descend'})
tblB=5×4 table
                Age    Height    Weight    BloodPressure
                ___    ______    ______    _____________

    Wang        38       64       131       125     83  
    Berger      49       64       119       122     80  
    Joiner      40       67       133       117     75  
    Jacobson    43       69       163       109     77  
    Sweet       38       71       176       124     93  

创建一个表,其中包含列出五位病患信息的四个变量。Weight 变量包含缺失值。

LastName = {'Sweet';'Jacobson';'Wang';'Joiner';'Berger'};
Age = [38;43;38;40;49];
Height = [71;69;64;67;64];
Weight = [176;NaN;131;133;NaN];
BloodPressure = [124 93; 109 77; 125 83; 117 75; 122 80];
tblA = table(Age,Height,Weight,BloodPressure,'RowNames',LastName)
tblA=5×4 table
                Age    Height    Weight    BloodPressure
                ___    ______    ______    _____________

    Sweet       38       71       176       124     93  
    Jacobson    43       69       NaN       109     77  
    Wang        38       64       131       125     83  
    Joiner      40       67       133       117     75  
    Berger      49       64       NaN       122     80  

Weight 以升序对表行进行排序,将包含 NaN 的行放在最前面。

tblB = sortrows(tblA,'Weight','MissingPlacement','first')
tblB=5×4 table
                Age    Height    Weight    BloodPressure
                ___    ______    ______    _____________

    Jacobson    43       69       NaN       109     77  
    Berger      49       64       NaN       122     80  
    Wang        38       64       131       125     83  
    Joiner      40       67       133       117     75  
    Sweet       38       71       176       124     93  

创建一个时间表,并按行时间对行进行排序。

TimeDuration = [hours(3) hours(2) hours(1) hours(5) hours(6)]';
TT = timetable(TimeDuration,[98;97.5;97.9;98.1;101],[120;111;119;117;118]);
           
B = sortrows(TT,'TimeDuration')
B=5×2 timetable
    TimeDuration    Var1    Var2
    ____________    ____    ____

    1 hr            97.9    119 
    2 hr            97.5    111 
    3 hr              98    120 
    5 hr            98.1    117 
    6 hr             101    118 

输入参数

全部折叠

输入数组,指定为列向量或矩阵。

数据类型: double | single | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | logical | char | string | cell | categorical | datetime | duration
复数支持:

列排序向量,指定为非零整数标量或非零整数向量。每个指定的整数值指示一个按其排序的列。负整数表示排序顺序为降序。

排序方向,指定为包含 'ascend'(默认值)或 'descend' 的字符向量、字符串数组或字符向量元胞数组。如果 direction 是字符向量元胞数组,则条目数必须与要排序的列数或变量数匹配。

如果同时指定 column 参量和 direction 参量,则 sortrows 根据 direction 进行排序,而忽略 column 中元素的符号。

数据类型: char | string | cell

输入表,指定为表或时间表。tblA 中的每个变量必须是 sortsortrows 的有效输入。

数据类型: table | timetable

输入表或时间表的第一个维度的名称,指定为字符串标量或字符向量。

  • 如果 tblA 是包含行名称的表,则 rowDimName 是表的第一个维度的名称。默认情况下,第一个维度的名称为 "Row"。维度名称是表的属性。您可以使用 tblA.Properties.DimensionNames 访问 tblA 的维度名称。

  • 如果 tblA 是时间表,则 rowDimName 是行时间向量的名称。您可以在创建时间表时指定其名称,例如 TimeDate。也可以使用 tblA.Properties.DimensionNames 访问维度名称。

示例: 如果表 T 具有行名称,并且您使用 T.Properties.DimensionName{1} = "Name" 更改了第一个维度的名称,则 sortrows(T,"Name") 会按行名称对表进行排序。

示例: 如果时间表 TT 具有名为 Date 的时间向量,则 sortrows(TT,"Date") 将按 Date 中包含的日期和时间对时间表进行排序。

数据类型: string | char

排序变量,指定为整数标量、整数向量、变量名称、变量名称的字符串数组、变量名称元胞数组、pattern 标量或逻辑向量。vars 指示要按其排序的表变量。

如果 vars 的元素为正整数,则 sortrows 按升序对 tblA 中的相应变量排序。如果 vars 的元素为负整数,则 sortrows 按降序对 tblA 中的相应变量排序。

示例: sortrows(tblA,["Height","Weight"]) 首先按变量 Height,然后按变量 Weight 以升序对 tblA 的行进行排序。

示例: sortrows(tblA,"X" + wildcardPattern) 按名称以字母 "X" 开头的表变量,使用通配符模式匹配名称中的其余字母,对 tblA 的行按升序排序。

示例: sortrows(tblA,[1 4]) 先按 tblA 的第一个变量以升序排序,如果第一个变量相同,再按第四个变量排序。

示例: sortrows(TT,["Time","X"]) 先按升序对时间表 TT 的行时间进行排序,然后再按表变量 X 进行排序。

数据类型: double | single | string | char | cell | pattern | logical

名称-值参数

将可选的参量对组指定为 Name1=Value1,...,NameN=ValueN,其中 Name 是参量名称,Value 是对应的值。名称-值参量必须出现在其他参量之后,但参量对组的顺序无关紧要。

在 R2021a 之前,使用逗号分隔每个名称和值,并用引号将 Name 引起来。

示例: sortrows(A,'MissingPlacement','last')

缺失值(NaNNaT<undefined>missing)的位置,指定为逗号分隔的对组,包含 'MissingPlacement' 和下列项之一:

  • 'auto' - 缺失的元素放在最后(对于升序排序)或放在最前面(对于降序排序)。

  • 'first' - 缺失的元素放在最前面。

  • 'last' - 缺失的元素放在最后。

元素比较方法,指定为逗号分隔的对组,包含 'ComparisonMethod' 和下列项之一:

  • 'auto' - 当 A 为实数时,按 real(A)A 的行进行排序;当 A 为复数时,按 abs(A) 进行排序。

  • 'real' - 当 A 为实数或复数时,按 real(A)A 的行进行排序。如果 A 的列包含具有相等实部的元素,则使用 imag(A) 进行排序。

  • 'abs' - 当 A 为实数或复数时,按 abs(A)A 的行进行排序。如果 A 的列包含具有相等模的元素,则使用区间 (-π,π] 中的 angle(A) 进行排序。

输出参量

全部折叠

已排序的数组,以向量、矩阵或多维数组的形式返回。B 的大小与 A 相同。

数据类型: double | single | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | logical | char | string | cell | categorical | datetime | duration

已排序的表,返回为与 tblA 具有相同变量的表或时间表。

数据类型: table | timetable

排序索引,以索引向量的形式返回。排序索引描述输入中的行的重新排列,以便 B = A(index,:)

sortrows 函数使用一种稳定的排序算法。因此,当输入包含重复值时,无论排序方向如何,排序索引都会保留输入的原始顺序。例如,如果 A = [1 1; 2 2; 1 2; 2 2],则 [Ba,Ia] = sortrows(A,'ascend') 返回排序索引 Ia = [1; 3; 2; 4][Bd,Id] = sortrows(A,'descend') 返回排序索引 Id = [2; 4; 3; 1]

数据类型: double

扩展功能

版本历史记录

在 R2006a 之前推出