2017-03-21 11 views
0

私はルーレットホイールの選択(http://www.edc.ncl.ac.uk/assets/hilite_graphics/rhjan07g02.png)を実行しており、n要素の選択を計算したいと思います。どのようにしてループの使用を避けることができますか?(ルーレットホイール)配列内の複数の要素をソートする

例えば、私は、次のprobベクトル有する:、

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

= 2

しかし:

prob = [0.1 0.3 0.4 0.15 0.05]; 

単一element=0.2の選択であろうがの選択を計算するのはどうですか要素?直感的で遅い方法は次のようになります。

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

これがためのループの使用を避けて実装する方法はありますか?

ありがとうございます。

+0

あなたの例が実行されません。あなたは決して要素を定義しません – Suever

+0

ええ、それは擬似コードでした。私は質問を更新します... –

+0

'cumprob'を使うつもりはありませんか? – Suever

答えて

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 

>> 
関連する問題