2016-08-18 5 views
1

でそれを生成するために、いテーブルから生成した番号を取得します。は、それがより良いループの外のすべての乱数を生成したり、乱数を生成するために必要なすべての反復で、それは冒頭で一度、すべての乱数を生成し、各反復でする方が良いかどうフライ通常

しかし、私はこの直感に反する今日の問題に遭遇します。私は長さNの数値ベクトルを持っている、各反復で、私はこのベクトルの順序を再シャッフルして何かをしなければならない。

Iは、2つの方法を実施する:最初のものは、私はちょうど説明とまったく同じであり、すなわち、各反復において、Iは、ループの前に、私は

関数を呼び出し、第2の方法において

V = randperm(N) 

関数を呼び出します

W = arrayfun(@(x)randperm(N),(1:T-1)','UniformOutput',0); 
W = cell2mat(W); 

ここでTは、繰り返しの合計数です。その後、各反復で、行列Wから行を取得します。 2つのメソッドの残りのコードはまったく同じです。

しかし、私は、第二のコードが第一1(私はのコマンドことを確認:W = arrayfun(@(x)randperm(N),(1:T-1)','UniformOutput',0);は多くの時間を取ることはありません)よりはるかに遅いです見つけます。私はプロファイラを実行すると、私は2番目のコードでは、関数ismember>ismemberR2012aを1回目のコードより3回呼び出すことがわかります。なぜ私は理解できませんでした。

+0

「rあなたは大きなランダムな行列を与えることができる 'randi'のようなものではありませんか? – Matt

答えて

0

まず、関数randpermarrayfunの両方がmexファイルとして実装されていることに注意してください。だから私の最初の推測は、randpermを呼び出してその結果をcellに保存し、このプロセスを繰り返すプロセスであるということです。それは少し遅くなります。最初のソリューションで同じことをしようとすると、コストがかかります。 私はいくつかのテストも行った。 私はNTのスケールを知らない。しかし、それでもまだ、私は私のマシン

N=10000; 
T = 1000; 
tic; 
for ii=1:T-1 
    V=randperm(N); 
end 
toc; 
tic; 
W = arrayfun(@(x)randperm(N),(1:T-1)','UniformOutput',0); 
W = cell2mat(W); 
toc; 

上の機能をテストし、その結果は次のとおりです。

N=10000については

T=1000

Elapsed time is 0.849627 seconds. 
Elapsed time is 0.996933 seconds. 

私は理由が最初の溶液がT-1回呼び出されていることだと思います2回目は1回だけ呼び出されます。そして、それは大きな細胞割り当てを管理しなければならない。あなたは乱数を生成することができる場合 enter image description here

  • :次に、プロファイラを実行している

    tic; 
    for ii=1:T-1 
    Z = arrayfun(@(x)randperm(N),ii,'UniformOutput',0); 
    end 
    toc; 
    
    Elapsed time is 0.827387 seconds. 
    Elapsed time is 0.966013 seconds. 
    Elapsed time is 0.951093 seconds. 
    

    enter image description here

    はでも多くのコードのパフォーマンスが向上することはありませんこれを行いますオンザフライで、それらを生成して格納し、必要に応じて再度ロードするポイントは何ですか?

  • 番号が異なる実行中に収集され、明らかに実行時間の確率的性質のために、彼らは一貫していません。

    だけNが10よりも小さい場合、あなたはpermsを使用する場合がありますのでご注意を作る
+0

だから、各繰り返しで別々にrandperm(N)を実行するほうが良いようです。この場合もメモリが問題になるのでしょうか?私たちが各反復でrandperm(N)を呼び出すと、名前はループなしで1回の呼び出しよりもわずかなメモリを消費します。 – ftxx

+0

必要なときに一度呼び出すことになります。 – NKN

0

ループの前に:その後、

% get all available permutations: 
W = perms(1:N); 
% get a list of T random permutations from W: 
p = randi(length(W),T,1); 

とループ内pWを使用:

V = W(p(k),:); % for iteration k 
関連する問題