Как получить набор мощности? - PullRequest
0 голосов
/ 04 мая 2019

Я хотел бы рассмотреть набор мощности в моем коде. Я хочу, чтобы в каждом цикле я получал подмножество {1,2,3,...,n}. Например, n=3. В первом цикле я хотел бы извлечь число 1 и сохранить в переменной Index. В конечном счете, я хочу получить Index=2 во втором цикле, Index=3 в третьем цикле, Index=[1,2] в четвертом цикле, Index=[1,3] в пятом цикле, Index=[2,3] в шестом цикле и, Index=[1,2,3] в седьмом цикле. Конечно, я хотел бы, чтобы n могло быть любым произвольным числом, скажем, оно может быть 100. Я могу подумать о перечислении всех случаев, но есть ли способы выполнить мою задачу?

1 Ответ

1 голос
/ 04 мая 2019

nchoosk должен найти все k-длинные комбинации.Я предлагаю следующее решение:

n = 3;
index = {};
for ii = 1:n
    k = nchoosek(1:n,ii);
    c = num2cell(k,2);
    index(end+1:end+length(c),1) = c;
end

Другой подход - использовать двоичную систему, где 001 означает, что вы берете только 1, 011 равно [1,2], 111 равно [1,2,3] и т. Д.Затем вы можете получить его с помощью dec2bin без цикла:

isChosen = dec2bin(1:2^n-1) == '1';

Однако, если мы должны иметь его в качестве массива ячеек, вы перебираете строки:

index1 = {};
for ii = 1:size(isChosen,1)
    index1{ii,1} = find(isChosen(ii,:));
end

И затем, если вы настаиваете на разумном заказе:

[~,order] = sort(cellfun(@sum,index1));
index1 = index1(order);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...