如何移除矩阵重复行?基于前两列无序元素对的去重方法
解决矩阵中前两列无序重复行的移除问题
这个需求其实很好实现,核心思路是把无序的元素对转化为有序的,这样就能用MATLAB的unique函数来识别重复项了。我给你详细拆解步骤,用你的例子来验证:
假设你的原矩阵是:
A = [3 3 3; 3 2 3; 3 2 3; 1 3 3; 3 1 2];
方法一:排序+Unique(最直观的方案)
这是最简洁的实现方式,完全贴合你的需求:
- 先提取矩阵的前两列,我们要处理的就是这两列的无序重复:
first_two_cols = A(:, 1:2); - 对每行的两个元素进行行内排序——这样像
[3,2]和[2,3]就会变成完全一样的[2,3],无序重复就转化成了有序重复:sorted_cols = sort(first_two_cols, 2); % 第二个参数2表示按行排序 - 用
unique函数找到排序后矩阵的唯一行,同时返回这些唯一行在原排序矩阵中的首次出现索引(这里一定要加'stable'参数,不然结果会按字典序重新排列,不符合你的需求):[~, unique_idx] = unique(sorted_cols, 'rows', 'stable'); - 最后用这个索引提取原矩阵的对应行,就是你要的结果:
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
相关产品推荐
相关产品推荐

