関数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 倍も高速です (これは、あなたのような巨大なループでは大きな違いを生むでしょう)。