Matlab - бинарный вектор с высокой концентрацией 1 с (или 0 с) - PullRequest
3 голосов
/ 31 марта 2010

Каков наилучший способ генерирования числа X случайных двоичных векторов размера N с концентрацией 1 с (или, симметрично, из 0 с), которая простирается от очень низкой до очень высокой?

Использование randint или unidrnd (как в этот вопрос ) создаст двоичные векторы с равномерным распределением, что в данном случае мне не нужно.

Любая помощь приветствуется!

Ответы [ 4 ]

6 голосов
/ 31 марта 2010

Подход Laserallan - это путь.

Для вектора с 10 элементами и 70%, которые распределены случайным образом, вы пишете

randVec = rand(10,1)<0.7;

РЕДАКТИРОВАТЬ Если вы хотите, чтобы X векторов длины N увеличивалось, вы пишете

thresVec = linspace(0,1,X);  %# thresholds go from 0 (all 0) to 1 (all 1)  
randVec = bsxfun(@lt,rand(N,X),threshVec); %# vectors are per column

Обратите внимание, что randVec является логическим массивом. В зависимости от того, что вы хотите с ним сделать, вы можете преобразовать его в удвоенное значение, например

randVec = double(randVec);
3 голосов
/ 31 марта 2010

Я не эксперт по Matlab, но подход, который должен быть довольно простым для реализации, заключается в генерации векторов случайных чисел с плавающей запятой (предпочтительно в диапазоне от 1 до 0), а затем в значениях, превышающих определенный порог, равных 1, а ниже - 0. Допустим, вы хотите 30% единиц, вы устанавливаете все значения выше 0,7 на 1, а значения ниже на 0.

2 голосов
/ 31 марта 2010

Использование

rand(N,1)<p   %# 0 < p < 1

даст вам вектор Nx1 с в среднем N * p в нем (а в других местах будет ноль) - но на некоторых прогонах вы можете получить вектор, отличный от того, что вы ожидаете например, он может иметь все нули ... может быть очень маловероятным, но все же не равным нулю).

Если вы хотите точно единиц и B нулей, вы можете сделать это:

rand_vec = [ones(A, 1); zeros(B, 1)];
rand_vec = rand_vec(randperm(A+B));

Затем вы можете установить A и B в соответствии со своими потребностями.

EDIT:
Теперь я понял ваш вопрос лучше: Допустим, у вас есть вектор p, который содержит искомые пропорции 1 в вашем населении, N - количество элементов в каждом векторе.

rand_mat = rand(N, size(p,2)) < repmat(p', [1,N])';

Даст вам матрицу Nx (размер (p, 2)), где столбец i - это вектор с p (i) (в среднем, как описано выше), а остальные - нули.

1 голос
/ 31 марта 2010

Вы можете использовать битовые или операции с равномерно распределенными двоичными векторами, я подозреваю, что точное распределение, которое вы в итоге получите, будет немного сложным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...