【问题标题】:delete rows in matrix under conditions in matlab在matlab中的条件下删除矩阵中的行
【发布时间】:2015-10-16 14:13:18
【问题描述】:

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

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 的所有行。但我不知道如何做我描述的事情

【问题讨论】:

    标签: matlab conditional-statements rows


    【解决方案1】:

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

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

    >> [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
    

    【讨论】:

    • 与帖子中所需的输出相比,此结果的顺序相反......我想这并不重要,因为您确实会处理输入未按行排序的情况.
    • 是的,其实输出倒序也无所谓,因为大多数时候输入没有排序,需要先排序再删除行。顺便说一句,谢谢你们!
    • 如果是这样,那么我的解决方案也可以。它假定在​​删除之前对行进行排序。
    【解决方案2】:

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

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

    【讨论】:

    • 一个更好的解决方案恕我直言。 +1。
    • 是的,我看到这段代码以更通用的方式完成了我想要的工作。我也会试试的。谢谢!
    【解决方案3】:

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

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

    >> [~,ind,~] = unique(A(:,1:3), 'rows', 'last');
    >> B = A(ind,:)
    
    B =
    
         1     2     3     7
         5     6     7    10
    

    【讨论】:

    • 您的解决方案要求输入已经排序(如示例数据集中),对吧?
    • @m.s.是的。在编辑之前,我会等待,看看这是否是一个有效的假设。
    猜你喜欢
    • 2022-01-26
    • 1970-01-01
    • 2019-12-13
    • 2018-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多