0

Octave での画像処理について助けが必要です。一部の画像でローカルの「スライディング ウィンドウ」ssd を計算しようとしています。速度が非常に遅い (ネストされた for ループを追加すると、最大 88*120*41*41 の反復)、それを処理することは不可能です。私が使用しているバージョンは、Windows7 64bit で 3.6.2 です。(corei5)

次のオクターブスクリプトを起動しています

http://pastebin.com/AjDJSX6e

次の画像に

http://picpaste.com/pattern1-90xYCNZB.bmp

なにか提案を?ご清聴ありがとうございました

4

1 に答える 1

0

関数filter2,ordfilt2およびblockproc(この最後の関数を使用する可能性が最も高いです。2.0.0 より前のパッケージ バージョンでは blkproc と呼ばれていました) でループします。あなたのコードが何をしようとしているのかをよく見ていませんでしたが、それらのループが本当に必要な場合は非常に驚くでしょう. 異なるインデックスで単純な演算のみを行っているようです。コードをベクトル化する方法を学ぶと、大幅な改善が見られます。コードが何をしているのかを説明できれば、もっと役立つかもしれません。

また、 を使用する必要はありません。sum (sum (x))これらを に置き換えることができますsum (x(:))。またsum (x.^2)、 を使用する必要はありません。使用できますsumsq (x)。したがって、あなたの 4 つの関数呼び出しsqrt (sum (sum (curDiff.^2)))は に置き換えることができますsumsq (curDiff(:))

以下を比較してください。

octave> x = rand (5000, 5000);
octave> t = cputime (); sqrt (sum (sum (x.^2))); cputime () - t
ans =  0.25202
octave> t = cputime (); sumsq (x(:));            cputime () - t
ans =  0.060004

はるかに短くて読みやすいだけでなく、4 倍も高速です (これは、あなたのような巨大なループでは大きな違いを生むでしょう)。

于 2012-11-22T16:04:05.327 に答える