(轮盘赌)对数组中的多个元素进行排序
(Roulette Wheel) Sorting multiple elements in an array
我正在执行轮盘赌选择 (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')
selected = 2
但是,如何计算 n
个元素的选择呢?直观而缓慢的方法是:
cumprob = cumsum(prob);
for id = 1:1:n
selected(id) = find(element(id)<=prob,1,'first');
end
有什么方法可以避免使用 for 循环来实现这一点?
提前致谢。
方法一:使用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
>>
我正在执行轮盘赌选择 (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')
selected = 2
但是,如何计算 n
个元素的选择呢?直观而缓慢的方法是:
cumprob = cumsum(prob);
for id = 1:1:n
selected(id) = find(element(id)<=prob,1,'first');
end
有什么方法可以避免使用 for 循环来实现这一点?
提前致谢。
方法一:使用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
>>