2015-06-15 5 views
3

У меня есть вопрос, подобный этому один: Weighted random numbers in MATLABНужна альтернатива randsample для вероятностных векторов с 0s в MATLAB

На данный момент, я использую randsample в моей программе следующим образом:

T = [0 .5 .5; .5 0 .5; .5 .5 0] 
choices = 1:3 

for i = 1:3 
    t(i) = transpose(randsample(choices,1,true,T(i,:))); 
end 

Таким образом, t(i) описывает каждого человека, которого он выберет.

В моей матрице T, когда читаемый ролик описывает вероятность того, что человек будет выбирать своего соседа. Например, первая строка говорит, что 1-й человек будет выбирать узел 2 или 3 с 50% -ной вероятностью. Они не могут выбрать свой собственный узел 1. Когда я увеличиваю свою модель, у них всегда будет равная вероятность выбора соседа, 1/количество соседей. Я жестко закодировал T-матрицу здесь для краткости.

Я пытался использовать histc как предложено в связанной теме, но так как всегда есть 0 в каждой строке моей T матрицы, я не думаю, что накопленная сумма точно устанавливает контейнеры для строк с 0 в средний (здесь второй ряд T).

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

Итак, есть ли у кого-нибудь идеи о том, как я могу ускорить свою функцию randsample? На данный момент я повторяю его 10000x, и поэтому он является основным узким местом в моей программе. Он работает так, как мне нужно, это слишком медленно.

+0

Ваш вопрос кажется мне удобным. Но на всякий случай, это справочники о том, как задавать хорошие вопросы: [ask], http://stackoverflow.com/help/mcve –

ответ

1

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

Я сделал бы это так. Это должно быть довольно быстро.

n = 7;      %// number of persons 
t = ceil((n-1)*rand(1,n)); %// step 1 
t = t + (t>=(1:n));   %// step 2 

Для каждого k, сгенерированный t(k) случайным образом выбираются из множества {1, 2, ..., k-1, k+1, ..., n} с равномерным распределением. Для достижения этой цели используются два шага:

  1. случайная величина определена из {1, ..., n-1};
  2. Если это значение больше или равно k, то оно увеличивается на 1.
Смежные вопросы