【发布时间】: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:16 与 10 个子集的所有可能组合。
combos = combntns(1:16,10)
但条件是返回的组合至少应包含以下向量的 1 个成员:
V1=1:4,V2=5:8,V3=9:12,V4=13:16,
有什么办法吗?
【问题讨论】:
标签: arrays matlab combinations combinatorics
使用该问题规模,您可以生成所有组合,然后选择满足要求的组合:
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,:);
【讨论】:
mod(numel(elements),vector{k}) == 0.Anyway,(几乎)通用向量的好解决方案)=)
mod(numel(elements),numel(vectors{1}))==0 吗?这不是真的必要。例如,我检查过 vectors = {1:3, 6:8, 9:11, 12:14} 并且它有效
cat(...)。如果它是 1:17 的组合(例如,最后一个向量可能是 13:17,或仅 17 本身),这是一个可能的场景。即使我在这里挑剔,我想这解决了 OP 的问题。