【问题标题】:find possible combinations with specific condition找到具有特定条件的可能组合
【发布时间】:2015-08-13 05:08:06
【问题描述】:

我想计算 1:16 与 10 个子集的所有可能组合。

combos = combntns(1:16,10)

但条件是返回的组合至少应包含以下向量的 1 个成员:

V1=1:4,V2=5:8,V3=9:12,V4=13:16,

有什么办法吗?

【问题讨论】:

    标签: arrays matlab combinations combinatorics


    【解决方案1】:

    使用该问题规模,您可以生成所有组合,然后选择满足要求的组合:

    n = 16;  %// number of elements to choose from
    c = 10;  %// combination size
    s = 4;   %// size of each group (size of V1, V2 etc)
    
    combos = nchoosek(1:n, c); 
    ind = all(any(any(bsxfun(@eq, combos, reshape(1:n, 1,1,s,[])),2),3),4);
    combos = combos(ind,:);
    

    这可以推广到通用元素任意条件向量,假设所有向量的大小都相同

    elements = 1:16;                    %// elements to choose from
    c = 10;                             %// combination size
    vectors = {1:4, 5:8, 9:12, 13:16};  %// cell array of vectors
    
    s = numel(vectors{1});
    combos = nchoosek(elements, c); 
    ind = all(any(any(bsxfun(@eq, combos, reshape(cat(1,vectors{:}).', 1,1,s,[])),2),3),4); %'
    combos = combos(ind,:);
    

    【讨论】:

    • 不错的解决方案,但如果任何 V 向量发生变化,这将失败......我不知道这是否可能,我猜可能不是。我正在研究使用随机 V 向量的一般情况的解决方案,但我无法避免循环(这使得它变得不那么有趣)。我现在已经关闭了 MATLAB,因为我想这可以解决 OP 的问题 =)
    • @StewieGriffin 谢谢!只要它们大小相同,就可以对任意向量执行此操作。我已经添加了
    • ...我没有运行 MATLAB,但我想这个条件也一定是真的? mod(numel(elements),vector{k}) == 0.Anyway,(几乎)通用向量的好解决方案)=)
    • @StewieGriffin 你的意思是mod(numel(elements),numel(vectors{1}))==0 吗?这不是真的必要。例如,我检查过 vectors = {1:3, 6:8, 9:11, 12:14} 并且它有效
    • .... 并且所有向量的大小必须相等,因为cat(...)。如果它是 1:17 的组合(例如,最后一个向量可能是 13:17,或仅 17 本身),这是一个可能的场景。即使我在这里挑剔,我想这解决了 OP 的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-13
    • 2022-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多