2015-05-07 8 views
0

Интересно, может ли следующий вектор векторизовать? Или, более просто, я пытаюсь сопоставить число с несколькими интервалами, результат которого определяет обновление процесса приращения. Большое спасибо!Можно ли векторизовать процедурные операции (для/если) в Matlab?

pop_matrix = [10 0 0 0 0 0]; 
    rand_num =rand; 
    divid = [0.05 0.05 0.1 0.2 0.1 0.1]; 

for i = 1:6 
    if rand_num < sum(divid(1:i)) 
     pop_matrix(i) = pop_matrix(i)+1; 
     break 
    end 
end 
+0

Я отправлю ответ с помощью векторизованного кода, но вы могли бы уточнить, что вы подразумеваете под «совпадением нескольких интервалов»? Мне просто интересно, есть ли более простой способ сделать это. – eigenchris

+0

Большое спасибо, за собственный быстрый ответ. –

+0

Я сейчас угадываю свой ответ. Когда вы кладете 'break' там, вы имеете в виду, что хотите только проверить, насколько первый интервал преуспевает, но ни один после этого не правильный? – eigenchris

ответ

3

должно работать:

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).

+0

@ XiaoYi Второй ответ должен работать быстрее первого, если вы планируете использовать код для рисования многих образцов. – eigenchris

Смежные вопросы