相对于Matlab中的最后一列,排除除最后一个元素之外的相等行

时间:2016-03-09 19:52:55

标签: arrays matlab sorting matrix

我对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]

2 个答案:

答案 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