如何高效实现两个双列数组基于双列元素匹配的差集计算
双列数组差集高效实现方法
需求定义
对两个double类型的双列数组a、b取差集,仅保留a中存在、b中不存在的行,行匹配要求两列数值同时相等,符合以下示例规则:
示例1:
a = [1 2; 1 3; 2 3],b = [1 2; 2 3],输出c = [1 3]
示例2:a = nchoosek([1 2 3 4 5 6],2),b = [1 2; 1 3; 2 4;3 5;3 6],输出c = [1 4;1 5;1 6;2 3;2 5;2 6;3 4;4 5;4 6; 5 6]
Matlab 实现(示例使用Matlab语法场景)
内置函数方案(优先推荐,效率最高)
直接调用官方优化的setdiff函数即可,代码如下:
c = setdiff(a, b, 'rows', 'stable');
参数说明:
'rows':指定按行做匹配,同时校验两列数值,完全符合需求'stable':保留输出c的行顺序和a中的原始顺序一致,不需要保留顺序可删除该参数,运算速度会更快
手动向量化方案(自定义逻辑场景可用)
如果需要自行调整匹配规则,可基于广播实现,无需循环:
match_mask = all(a == permute(b, [3,2,1]), 2); c = a(~any(match_mask, 3), :);
Python 实现(Numpy场景)
基于Numpy的结构化数组实现高效匹配:
import numpy as np # 将每行转成单值结构化类型做匹配 a_row = a.view(np.dtype((np.void, a.dtype.itemsize * a.shape[1]))) b_row = b.view(np.dtype((np.void, b.dtype.itemsize * b.shape[1]))) # 取差集对应索引筛选a的行 _, idx = np.setdiff1d(a_row, b_row, assume_unique=True, return_indices=True) c = a[idx]
说明:确认a、b内部无重复行时添加assume_unique=True参数,可大幅提升运算效率。
内容的提问来源于stack exchange,提问作者user12928042
相关产品推荐
相关产品推荐

