Я задаюсь вопросом, существует ли эффективный путь в MATLAB для генерации всех векторов фиксированной длины с элементами от конечного множества.
Например, как я могу создать все векторы из длины 5 только с 0 или 1 как элементы?
не совсем то, что вам нужно, но permv генерирует перестановки векторов. Если вы не найдете точного решения, вы можете адаптировать векторные перестановки.
Правильный способ построения всех векторов длины 5 с элементами только 0 или 1 -
a = dec2bin(0:31,5) - '0';
Надеюсь, вы понимаете, почему.
MathWorks' FileExchange - ваш друг:
Итак, используя первую функцию, все просто:
VChooseKRO([0 1], 5)
Вы даже можете заставить ее работать для массива строк ячеек как конечного множества:
C = {'a' 'b' 'c' 'd'};
C( VChooseKRO(1:numel(C), 2) )
Новый ответ:
Вы можете ускорить решение DEC2BIN , предложенное AB (с помощью woodchips ), используя вместо этого функцию BITGET . Есть два подхода к этому. Первый использует функцию REPMAT , чтобы сделать входные данные одинаковыми по размеру (обе матрицы размером 32 на 5):
allCombos = bitget(repmat((0:31)',1,5),repmat(5:-1:1,32,1));
А второй просто вызывает BITGET один раз для каждого отдельного бита, который вы хочу получить:
vec = (0:31)';
allCombos = [bitget(vec,5) bitget(vec,4) bitget(vec,3) ...
bitget(vec,2) bitget(vec,1)];
Вот несколько примеров таймингов:
Method | Average Time
-----------------+------------------
DEC2BIN | 0.000788 s
BITGET+REPMAT | 0.000727 s
BITGET x5 | 0.000045 s
Как видите, развернутый BITGET работает очень быстро.
Старый ответ: (для потомков)
Если вы хотите построить матрицу из всех возможных векторов нулей и единиц длиной 5, это будет один из способов сделать это. используя функции PERMS и UNIQUE (поскольку PERMS создает повторяющиеся строки):
allCombos = [0 0 0 0 0;
unique(perms([0 0 0 0 1]),'rows'); ...
unique(perms([0 0 0 1 1]),'rows'); ...
unique(perms([0 0 1 1 1]),'rows'); ...
unique(perms([0 1 1 1 1]),'rows'); ...
1 1 1 1 1];