You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何移除矩阵重复行?基于前两列无序元素对的去重方法

解决矩阵中前两列无序重复行的移除问题

这个需求其实很好实现,核心思路是把无序的元素对转化为有序的,这样就能用MATLAB的unique函数来识别重复项了。我给你详细拆解步骤,用你的例子来验证:

假设你的原矩阵是:

A = [3 3 3; 3 2 3; 3 2 3; 1 3 3; 3 1 2];

方法一:排序+Unique(最直观的方案)

这是最简洁的实现方式,完全贴合你的需求:

  1. 先提取矩阵的前两列,我们要处理的就是这两列的无序重复:
    first_two_cols = A(:, 1:2);
    
  2. 对每行的两个元素进行行内排序——这样像[3,2]和[2,3]就会变成完全一样的[2,3],无序重复就转化成了有序重复:
    sorted_cols = sort(first_two_cols, 2); % 第二个参数2表示按行排序
    
  3. 用unique函数找到排序后矩阵的唯一行,同时返回这些唯一行在原排序矩阵中的首次出现索引(这里一定要加'stable'参数,不然结果会按字典序重新排列,不符合你的需求):
    [~, unique_idx] = unique(sorted_cols, 'rows', 'stable');
    
  4. 最后用这个索引提取原矩阵的对应行,就是你要的结果:
    result = A(unique_idx, :);
    

运行完之后,result就是:

3     3     3
     3     2     3
     1     3     3

完全符合你期望的输出~

方法二:Findgroups+分组提取(适合复杂分组场景)

如果你后续需要对分组做更多操作,也可以用分组思路来实现,效果和第一种完全一致:

% 同样先排序前两列生成分组键
group_keys = sort(A(:,1:2), 2);
% 生成分组标签
groups = findgroups(group_keys);
% 找到每个分组的第一个元素索引
unique_idx = arrayfun(@(g) find(groups == g, 1), unique(groups));
% 提取结果
result = A(unique_idx, :);

关键细节说明

  • 为什么要排序?因为你要识别的是无序重复,排序后不管元素顺序如何,相同的元素对都会变成一致的行,这样unique才能正确识别重复项。
  • 为什么用'stable'?默认的unique会把结果按字典序排列,加了'stable'之后,会保留这些唯一行在原矩阵中首次出现的顺序,和你例子里的输出顺序完全匹配。

内容的提问来源于stack exchange,提问作者KiMaN

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:47:25