【问题标题】:excessive slowness for image processing (vectorization of nested for loops)图像处理速度过慢(嵌套 for 循环的矢量化)
【发布时间】:2012-11-21 14:50:27
【问题描述】:
【问题讨论】:
标签:
image
matlab
image-processing
octave
vectorization
【解决方案1】:
在函数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 倍(在像您这样的巨大循环中会产生巨大的差异)。