0

確率密度関数(ガウス)に従って分散された、100万を超えるエントリを含む長いベクトルがあります。正の値だけが必要です。これらは次のMWEのように見つかります。

N = 1.5e6;
vals = normrnd(0, 1, N, 1);

final = [];
for i=1:length(vals)
    if(vals(i)>0)
        final = [final vals(i)];
    end
end

問題は、これには長い時間がかかることです。MatLABでこれを行うためのよりスマートな方法はありますか?

ありがとう、ナイルズ。

4

3 に答える 3

6

matlab で for ループを使用せずに負の数を削除できます。

vals = normrnd(0, 1, N, 1);
vals(vals<0) = [];
于 2012-11-22T17:40:17.957 に答える
3

ループする必要はありません。正の値を選択するだけです。

final = vals( vals>0 );

編集: 興味があるので、2 つのアプローチのタイミングを計りました。新しい変数への割り当ては、要素の削除よりも約 2 倍高速です。とはいえ、どちらも非常に高速です。

>> N = 1.5e6;
>> vals = normrnd(0, 1, N, 1);
>> tic; final = vals( vals>0 ); toc
Elapsed time is 0.020852 seconds.
>> tic; vals(vals<0) = []; toc
Elapsed time is 0.041709 seconds.
于 2012-11-22T17:42:00.987 に答える
3

スクリプトが遅い理由の 1 つは、final以前に初期化していないためです。したがって、変数はループ内で成長しています。事前にそのサイズがわかっている場合は、最初に変数を初期化します。

N = 1.5e6;
vals = normrnd(0, 1, N, 1);

final = zeros(vals,1);
for i=1:length(vals)
    if(vals(i)>0)
        final(i) = vals(i);
    end
end

ただし、主な理由は、ループを使用しており、論理インデックスを使用してこの操作を実行できるためです。

final = vals( vals > 0 )
于 2012-11-22T17:42:04.370 に答える