должно работать:
pop_matrix = [10 0 0 0 0 0];
rand_num =rand;
divid = [0.05 0.05 0.1 0.2 0.1 0.1];
idx = find(cumsum(divid) > rand_num,1);
pop_matrix(idx) = pop_matrix(idx) + 1;
EDIT: метод, использующий interp1
, который примерно в 10 раз быстрее, если вы хотите привлечь N
образцы из распределения называется divid
:
pop_matrix = [10 0 0 0 0 0];
divid = [0.05 0.05 0.1 0.2 0.1 0.1];
N = 1000; %// number of random samples to take
rand_num = rand(N,1); %// generate N random numbers
dcs = cumsum(divid); %// get cumulative distribution
dcs = dcs/dcs(end); %// ensure this is normalized to 1
dcs = [0,dcs]; %// put a zero in front to create a new bin
s = interp1(dcs, 1:length(dcs), rand_num, 'previous', NaN); %// draw samples
pop_matrix = pop_matrix + accumarray(s,1)'; %'//add up samples together
Этот процесс в основном является выборкой из распределения вероятности, определяемого divid
, с использованием Inverse Transform Sampling method, где dcs
является функцией кумулятивной плотности распределения (CDF).
Я отправлю ответ с помощью векторизованного кода, но вы могли бы уточнить, что вы подразумеваете под «совпадением нескольких интервалов»? Мне просто интересно, есть ли более простой способ сделать это. – eigenchris
Большое спасибо, за собственный быстрый ответ. –
Я сейчас угадываю свой ответ. Когда вы кладете 'break' там, вы имеете в виду, что хотите только проверить, насколько первый интервал преуспевает, но ни один после этого не правильный? – eigenchris