我对Matlab中的一段代码有疑问。假设我们有一个矩阵
尺寸为A
mx4
A=[ 2 3 4 |1
2 3 4 |0
1 1 1 |0
1 1 1 |1
9 1 0 |0
9 1 0 |0
9 1 0 |1]
我想按顺序排列行的前三个元素相对于第四列的行。因此,我想得到
B=[ 2 3 4 |1
2 3 4 |0
1 1 1 |1
1 1 1 |0
9 1 0 |1
9 1 0 |0
9 1 0 |0]
答案 0 :(得分:1)
实现此目的的一种方法是创建一个M x 2矩阵,您可以使用sortrows
对其进行排序。 sortrows
对第一列进行排序,然后使用第二列来解决任何关系。第一列将是用于表示A
的前三列的唯一组合的索引。
对于您的示例数据,第一列将如下所示。
[~, ~, inds] = unique(A(:,1:3), 'rows', 'stable');
inds =
1
1
2
2
3
3
3
然后,第二列是您要排序的列(第4列)。
cat(2, inds, A(:,4))
1 1
1 0
2 0
2 1
3 0
3 0
3 1
现在我们要对此使用sortrows
并按升序对第一列进行排序,按降序对第二列进行排序。
sorted = sortrows(cat(2, inds, A(:,4)), [1 -2])
1 1
1 0
2 1
2 0
3 1
3 0
3 0
此第二列对应于您在B
中显示的所需第4列。因此,我们只需将其与A
的前三列连接即可创建B
。
B = cat(2, A(:,1:3), sorted(:,2))
2 3 4 1
2 3 4 0
1 1 1 1
1 1 1 0
9 1 0 1
9 1 0 0
9 1 0 0
因此,将所有这些结合在一起我们得到以下结果。
[~, ~, inds] = unique(A(:,1:3), 'rows', 'stable');
sorted = sortrows(cat(2, inds, A(:,4)), [1 -2]);
B = cat(2, A(:,1:3), sorted(:,2));
答案 1 :(得分:1)
使用splitapplay
(在R2015b中引入)
A=[ 2 3 4 1
2 3 4 0
1 1 1 0
1 1 1 1
9 1 0 0
9 1 0 0
9 1 0 1];
% Map first 3 columns to a single value
aux = str2num(strcat(num2str(A(:,1)),num2str(A(:,2)),num2str(A(:,3))));
% Find groups
G = sort(findgroups(aux));
% Sort groups of same value in descending order with respect to column 4
sorted = splitapply(@(x,y) {[dec2base(x,10)-'0',sort(y,'descend')]}, aux, A(:,4), G );
sorted = cell2mat(sorted)
sorted =
2 3 4 1
2 3 4 0
1 1 1 1
1 1 1 0
9 1 0 1
9 1 0 0
9 1 0 0