Генерация векторов в MATLAB - PullRequest
5 голосов
/ 26 февраля 2010

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

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

Ответы [ 4 ]

10 голосов
/ 26 февраля 2010

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

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

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

3 голосов
/ 26 февраля 2010

MathWorks ' FileExchange ваш друг:

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

VChooseKRO([0 1], 5)

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

C = {'a' 'b' 'c' 'd'};
C( VChooseKRO(1:numel(C), 2) )
3 голосов
/ 26 февраля 2010

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

permv

1 голос
/ 26 февраля 2010

Новый ответ:

Вы можете ускорить решение DEC2BIN , предложенное AB (с помощью деревянные щепки ), вместо этого используя функцию 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];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...