我需要 Octave 图像处理方面的帮助。我正在尝试在某些图像上计算本地“滑动窗口”ssd。速度太慢了(嵌套的 for 循环加起来 88*120*41*41 次迭代),因此无法使用它。我使用的版本是 Windows7 64 位上的 3.6.2。(corei5)
我正在启动以下八度脚本
到下图
http://picpaste.com/pattern1-90xYCNZB.bmp
有什么建议吗?预先感谢您的关注
我需要 Octave 图像处理方面的帮助。我正在尝试在某些图像上计算本地“滑动窗口”ssd。速度太慢了(嵌套的 for 循环加起来 88*120*41*41 次迭代),因此无法使用它。我使用的版本是 Windows7 64 位上的 3.6.2。(corei5)
我正在启动以下八度脚本
到下图
http://picpaste.com/pattern1-90xYCNZB.bmp
有什么建议吗?预先感谢您的关注
在函数处循环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 倍(在像你这样的巨大循环中会产生巨大的差异)。