在matlab中的条件下删除矩阵中的行

delete rows in matrix under conditions in matlab

我的程序创建了一个矩阵,其中几行中的单元格的值在相应列中是相同的。我想删除其中一些行以过滤矩阵。澄清一下,我的矩阵具有以下形式,

A=[ 1 2 3 4
    1 2 3 5
    1 2 3 6
    1 2 3 7
    5 6 7 8
    5 6 7 9
    5 6 7 10]

我想删除第一列、第二列和第三列中它们的值相同的行,并在矩阵中保留第四行中具有最大值的行。结果应为以下矩阵:

A=[ 1 2 3 7
    5 6 7 10]

我知道当我们使用如下条件删除矩阵中的行时:M(M(:,4)<=1.5,:)=[];,它会删除矩阵中第四列中值小于 [=13 的所有行=].但我不知道如何做我描述的事情

使用带有 rows 标志的 unique 并索引到前三列。确保选择 last,以便选择遇到的 last 唯一值。默认方式是给你遇到的第一个唯一值。

从这个唯一调用中你需要的是第二个元素,它为你提供了最后一次唯一遇到的行,然后你将使用它来子集到你的原始矩阵中:

>> [~,ind,~] = unique(A(:,1:3), 'rows', 'last');
>> B = A(ind,:)

B =

     1     2     3     7
     5     6     7    10

下面的代码执行以下步骤:

  1. 按最后一列降序排列A
  2. 找出前 3 列中唯一的元组
  3. 基于 2,select 最后一列中具有最高值的行

>> [Y,I]=sort(A(:,4), 'descend');
>> B=A(I,:);
>> [~, ind] = unique(B(:,1:3), 'rows', 'stable');

>> result = B(ind,:)

result =

 5     6     7    10
 1     2     3     7

另一种方法是使用 accumarray,这将使您可以轻松地选择任意函数,而不仅仅是每组中的最大值:

[a,~,subs] = unique(A(:,1:3),'rows');
B = [a, accumarray(subs,A(:,4),[],@max)]