(轮盘赌轮)对数组

时间:2017-03-21 12:34:55

标签: arrays matlab roulette-wheel-selection

我正在进行轮盘赌选择(http://www.edc.ncl.ac.uk/assets/hilite_graphics/rhjan07g02.png),我想计算n元素的选择。我怎么能避免使用循环?

例如,我有以下prob向量:

prob = [0.1 0.3 0.4 0.15 0.05];

选择单个element=0.2将是:

cumprob = cumsum(prob);
selected = find(element<=prob,1,'first')
  

选择= 2

但是,计算n元素的选择呢?直观而缓慢的方式是:

cumprob = cumsum(prob);
for id = 1:1:n 
   selected(id) = find(element(id)<=prob,1,'first');
end

有没有办法实现这个,避免使用for循环?

提前致谢。

1 个答案:

答案 0 :(得分:1)

方法1:使用discretize(需要Matlab版本R2015a或更新版本)

方法2:使用速度较慢的arrayfun

测试代码:

n = 5e6;
element = rand(n,1);
prob = [0.1 0.3 0.4 0.15 0.05];

cumprob = cumsum(prob);

tic
selected1 = zeros(n,1);
for id = 1:1:n 
   selected1(id) = find(element(id)<=cumprob,1,'first');
end
toc

tic
selected2 = discretize(element,[0,cumprob]);
toc
isequal(selected1, selected2)

tic
selected3 = arrayfun(@(e) sum(e>=cumprob)+1, element);
toc
isequal(selected1, selected3)

时间(不准确,但有效)和准确性比较:

Elapsed time is 5.634721 seconds.
Elapsed time is 0.059813 seconds.

ans =

     1

Elapsed time is 18.838859 seconds.

ans =

     1

>>