在matlab

时间:2015-10-16 14:13:19

标签: matlab conditional-statements rows

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

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,:)=[];,它会删除矩阵中第四列中的值小于1.5的所有行。但我不知道如何做我所描述的事情

3 个答案:

答案 0 :(得分:2)

以下代码执行以下步骤:

  1. 按最后一列按降序排序A
  2. 从前3列中找到唯一的元组
  3. 基于2,选择最后一列中值最高的行
  4. >> [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
    

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

uniquerows标记和索引一起使用到前三列中。请务必选择last,以便选择遇到的最后唯一值。默认方式是为您提供遇到的第一个唯一值。

这个唯一调用所需要的是第二个元素,它为您提供了最后一个遇到的行的行,然后您将其用于子集到原始矩阵中:

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

B =

     1     2     3     7
     5     6     7    10