0
我想計算1:16與10個子集的所有可能的組合。找到可能的組合與特定條件
combos = combntns(1:16,10)
但條件是,返回的連擊應具有以下矢量的至少1個構件:
V1=1:4,V2=5:8,V3=9:12,V4=13:16,
任何溶液?
我想計算1:16與10個子集的所有可能的組合。找到可能的組合與特定條件
combos = combntns(1:16,10)
但條件是,返回的連擊應具有以下矢量的至少1個構件:
V1=1:4,V2=5:8,V3=9:12,V4=13:16,
任何溶液?
這一問題大小,你都不能生成所有組合,然後選擇那些符合要求:
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矢量c絞刑......我不知道這是否可能,可能不是我想的。我正在爲隨機V矢量的一般情況下的解決方案,但我無法避免一個循環(這使得它更少有趣)。我現在關閉了MATLAB,因爲我想這解決了OP的問題=) –
@StewieGriffin謝謝!只要它們的大小相同,就可以對任意矢量進行處理。我已經添加了 –
...我沒有運行MATLAB,但我想這個條件也必須是真的? 'mod(numel(elements),vector {k})== 0'.Anyway,(幾乎)通用向量的很好的解決方案)=) –