2013-06-20 20 views
5

このコードでどのようにボトルネックを処理できるか知りたい。 N ~ 10^6np ~ 1000number of calls to this part of code = 1000ため現在MATLAB行列の要素を見つけるための効率的な方法

%% Points is an Nx3 matrix having the coordinates of N points where N ~ 10^6 
Z = points(:,3) 
listZ = (Z >= a & Z < b); % Bottleneck 
np = sum(listZ); % For later usage 
slice = points(listZ,:); 

、ボトルネックの文は私のコードの残りの部分に比べて時間の大きな塊である、合計で約10秒を取っています。

Profiling Results

@EitanT

Profiling for sample code Profiling for sample code

+1

あなたはそれがだと確信していますボトルネック(プロファイル結果を表示できますか?)とにかく 'num_calls'は何ですか? –

+0

@EitanTはい私はMATLABプロファイラ自体でチェックしましたが、このステートメントは確かにボトルネックです – OrangeRind

+0

@EitanTプロファイリング結果を追加しました – OrangeRind

答えて

8

Z = rand(1e6,3); 
a=0.5; b=0.6; 
c=(a+b)/2; 
d=abs(a-b)/2; 
tic 
for k=1:100, 
    listZ1 = (Z >= a & Z < b); % Bottleneck 
end 
toc 

tic 
for k=1:100, 
    listZ2 = (abs(Z-c)<d); 
end 
toc 

isequal(listZ1, listZ2) 

戻り

Elapsed time is 5.567460 seconds. 
Elapsed time is 0.625646 seconds. 

ans = 

    1 
+1

ああ!それは私に[過去に尋ねたもの]を思い起こさせます(http://stackoverflow.com/questions/12137233/matlab-performance-comparison-slower-than-arithmetic)。確かに、私はこれが行く方法だと思います。 –

+0

これは良いです!実際のプログラムでは、コードの残りの部分が複雑であるために、少し大きめのものになってしまいますが、それでももっと多くのことができると思います。 – OrangeRind

+2

[この最近のCプログラミングに関する質問](http://stackoverflow.com/a/17095534/1165522)の回答も参照してください。 – horchler

1

によって要求された唯一のインデックス文のサンプルコードのいくつかのより多くのスクリーンショットは、このような何かやってみてください。

for i = 1:1000 
    x = (a >= 0.5); 
    x = (x < 0.6); 
end 

を私はそれがより速いことを発見した:

01約4秒による
for i = 1:1000 
    x = (a >= 0.5 & a < 0.6); 
end 

Elapsed time is 0.985001 seconds. (first one) 
Elapsed time is 4.888243 seconds. (second one) 

私はあなたの減速の理由は、要素賢明&操作だと思います。最悪の場合と仮定

+0

より詳しく質問をお読みください。 :) – OrangeRind

+0

あなたは今何を意味するか分かります。 – KronoS

+0

@OrangeRind更新された回答を参照してください。 – KronoS

3

:比較はシングルスレッド

ある要素単位&

  • 内部で短絡していないあなたは〜10秒で2*1e6*1e3 = 2e9比較をやっています。これは1秒あたり2億回の比較(〜200 MFLOPS)です。

    1.7 GFLops on a single coreを行うことができると考えると、実際これはかなり低いようです。

    Windows 7を実行していますか?もしそうなら、あなたの電源設定をチェックしましたか?あなたはモバイルプロセッサ上にいるので、デフォルトでは、低消費電力方式が有効になると期待しています。これにより、ウィンドウが処理速度を縮小することができるので、確認してください。

    それ以外は....私は本当に手掛かりがありません。片側の平等は、あなたが一方的な比較にそれを再定式ことができます重要ではありませんが、それはより速く、一桁を取得した場合

+0

素晴らしい点がありますが、私は電源プランを確認しました。そして、計算の際に、これがシングルスレッドで実行されているので、ターボブーストもまた踏み込んでいます。私はgeekbenchを通してCPUのスループットをチェックし、あなたに知らせます。 – OrangeRind