Генерация векторов в MATLAB

Я задаюсь вопросом, существует ли эффективный путь в MATLAB для генерации всех векторов фиксированной длины с элементами от конечного множества.

Например, как я могу создать все векторы из длины 5 только с 0 или 1 как элементы?

5
задан tshepang 27 May 2014 в 20:41
поделиться

4 ответа

не совсем то, что вам нужно, но permv генерирует перестановки векторов. Если вы не найдете точного решения, вы можете адаптировать векторные перестановки.

permv

3
ответ дан 18 December 2019 в 09:49
поделиться

Правильный способ построения всех векторов длины 5 с элементами только 0 или 1 -

a = dec2bin(0:31,5) - '0';

Надеюсь, вы понимаете, почему.

10
ответ дан 18 December 2019 в 09:49
поделиться

MathWorks' FileExchange - ваш друг:

Итак, используя первую функцию, все просто:

VChooseKRO([0 1], 5)

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

C = {'a' 'b' 'c' 'd'};
C( VChooseKRO(1:numel(C), 2) )
3
ответ дан 18 December 2019 в 09:49
поделиться

Новый ответ:

Вы можете ускорить решение 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];
1
ответ дан 18 December 2019 в 09:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: