在MATLAB中对数据进行排序取决于一列

时间:2015-09-16 15:10:17

标签: matlab sorting

如何根据MATLAB中另一列中的值对列进行排序?

A显示位置数据(它不是按顺序升序或降序)列B包含另一列位置数据。最后,列C包含数值。是否可以将B中的第一个位置值与C的第一个单元格中的数值相关联?在此之后,我想对B进行排序,使其与列A的顺序相同,C对应的B值后面的值{我的列的长度将是是1558个值。

在案件之前;

A     B     C
1      4      10
4      1      20
3      5      30
5      2      40
2      3      50

案例之后;

A     B     C
1      1      20
4      4      10
3      3      50
5      5      30
2      2      40

基本上AB变得相同,而C列跟在B之后。

4 个答案:

答案 0 :(得分:6)

由于您不希望事物按升序或降序排列,我不认为sortrows()之类的内置排序功能会对此有所帮助。相反,您将一列中的元素与另一列中的元素进行匹配。

使用[~,idx]=ismember(A,B)将告诉您B中每个元素的位置。您可以使用它来对所需的列进行排序。

M=[1      4      10
   4      1      20
   3      5      30
   5      2      40
   2      3      50];
A=M(:,1); B=M(:,2); C=M(:,3);
[~,idx]=ismember(A,B); 

sorted_matrix = [A B(idx) C(idx)]

答案 1 :(得分:1)

鉴于M = [A B C]

M =

    1    4   10
    4    1   20
    3    5   30
    5    2   40
    2    3   50

您需要对第一列排除矩阵的行进行排序:

s = sortrows(M(:,2:3));

s =

    1   20
    2   40
    3   50
    4   10
    5   30

然后使用第一列作为索引来重新排序生成的子矩阵:

s(M(:,1),:);

ans =

    1   20
    4   10
    3   50
    5   30
    2   40

这将用于构建输出矩阵:

N = [M(:,1) s(M(:,1),:)];

N =

    1    1   20
    4    4   10
    3    3   50
    5    5   30
    2    2   40

如果AB是值(1..m)的排列,那么之前的技术显然会起作用。如果不是这种情况,那么我们需要找到数组中每个值的排名。让我们从数组的新值开始:

    A    B   C
    1    5   60
    6    1   80
    9    6   60
   -4    9   40
    5   -4   30

我们像以前一样构建s

s = sortrows([B C]);

s =

   -4   30
    1   80
    5   60
    6   60
    9   40

我们可以通过两种方式生成排名。如果A(和B)的元素是唯一的,我们可以像this answer一样使用unique的第三个输出:

[~, ~, r] = unique(A);

r =

   2
   4
   5
   1
   3

如果A的值唯一,我们可以使用sort的第二个返回值,即按排序顺序排列的元素的原始数组中的索引,以生成排名每个元素:

[~, r] = sort(A);

r =

   4
   1
   5
   2
   3

[~, r] = sort(r);

r =

   2
   4
   5
   1
   3

正如您所看到的,结果r是相同的,只需要拨打sort 2次,而不是1次拨打unique。然后,我们使用r作为上面s的索引列表:

M = [A s(r, :)];

M =

    1    1   80
    6    6   60
    9    9   40
   -4   -4   30
    5    5   60

答案 2 :(得分:1)

bsxfunmatrix-multiplication的强大组合解决了这个问题并且对code-golfing也有好处!这是实现,假设M作为输入矩阵 -

[M(:,1) bsxfun(@eq,M(:,1),M(:,2).')*M(:,2:3)]

示例运行 -

>> M
M =
     1     4    10
     4     1    20
     3     5    30
     5     2    40
     2     3    50
>> [M(:,1) bsxfun(@eq,M(:,1),M(:,2).')*M(:,2:3)]
ans =
     1     1    20
     4     4    10
     3     3    50
     5     5    30
     2     2    40

答案 3 :(得分:0)

如果您必须保留A的顺序,请使用类似

的内容
matrix = [1 4 10; 4 1 20; 3 5 30; 5 2 40; 2 3 50];
idx = arrayfun(@(x) find(matrix(:,2) == x), matrix(:,1));
sorted = [matrix(:,1), matrix(idx,2:3)];