2015-08-13 4 views

ответ

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, приятное решение для (почти) общих векторов) =) –

Смежные вопросы