2015-08-13 36 views
0

我想計算1:16與10個子集的所有可能的組合。找到可能的組合與特定條件

combos = combntns(1:16,10) 

但條件是,返回的連擊應具有以下矢量的至少1個構件:

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

任何溶液?

回答

2

這一問題大小,你都不能生成所有組合,然後選擇那些符合要求:

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,:); 
+0

好的解決方案,但如果任何V矢量c絞刑......我不知道這是否可能,可能不是我想的。我正在爲隨機V矢量的一般情況下的解決方案,但我無法避免一個循環(這使得它更少有趣)。我現在關閉了MATLAB,因爲我想這解決了OP的問題=) –

+0

@StewieGriffin謝謝!只要它們的大小相同,就可以對任意矢量進行處理。我已經添加了 –

+0

...我沒有運行MATLAB,但我想這個條件也必須是真的? 'mod(numel(elements),vector {k})== 0'.Anyway,(幾乎)通用向量的很好的解決方案)=) –