如何根据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
基本上A
和B
变得相同,而C
列跟在B
之后。
答案 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
如果A
和B
是值(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)
bsxfun
和matrix-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)];