如何在Julia中获取数组元素唯一无冗余的两两组合
无冗余两两配对实现方案
你要实现的本质是从n个元素里选2个的无序不重复组合,不需要先生成全量笛卡尔积再逐轮剔除,有非常简便的实现方式,以下针对你用的Julia环境给出方案:
一步到位的推荐方案
Julia生态里有专门处理组合问题的工具库,直接调用就能生成你要的结果,全程不需要额外做剔除操作:
- 首次使用先安装依赖包:
using Pkg Pkg.add("Combinatorics") - 直接调用组合生成函数,输出格式和你之前用的
sets二维数组完全兼容:
运行后直接输出目标结果:using Combinatorics sy = 3 # 对应你的变量总数量 sets = collect(combinations(1:sy, 2))3-element Vector{Vector{Int64}}: [1, 2] [1, 3] [2, 3]
零依赖原生实现
如果不想引入第三方包,用两层循环直接生成符合要求的配对即可,性能比先生成再过滤的方案好很多:
sy = 3 sets = [] for i in 1:sy # 只取序号比i大的元素配对,天然跳过自比较、跳过逆序重复的冗余对 for j in i+1:sy push!(sets, [i, j]) end end
逻辑很简单:所有无序对都可以统一表示为「前一个元素序号 < 后一个元素序号」的形式,从根源上不会产生无效数据,不需要后置任何剔除步骤。
基于你现有代码的最小修改方案
如果要沿用你已经写完的前两步逻辑(生成全量对、剔除自比较),只需要在代码末尾加一行过滤逻辑即可,不需要写复杂的循环逐行删除:
# 接你已有的剔除自比较的代码之后 # 仅保留第一个元素小于第二个元素的行,自动过滤(2,1)(3,1)(3,2)这类逆序冗余对 sets = sets[sets[:,1] .< sets[:,2], :]
性能提示:当变量总数
sy较大时,先生成全量笛卡尔积再过滤的方案会产生大量冗余中间数据,运行效率远低于直接生成组合的方案,数据量超过1000时优先选择前两种直接生成的实现。
内容的提问来源于stack exchange,提问作者AaronJPung
相关产品推荐
相关产品推荐

