【发布时间】:2014-01-29 12:25:04
【问题描述】:
我正在实现(对于类,所以没有内置插件!)霍夫变换的变体来检测图像中的圆圈。我有一个工作产品,我得到了正确的结果。换句话说,我的任务完成了!但是,我想更进一步,并尝试稍微提高性能。此外,为了防止任何不可避免的反应,我知道 MATLAB 并不是最基于性能的语言,而且我知道 Hough 变换也不完全基于性能,但请听我说。
在生成霍夫累积空间时,我最终需要绘制很多圆(图像中每个边缘像素大约 75 个;每个搜索半径一个)。我写了一个漂亮的函数来做到这一点,它已经相当优化了。但是,我最终会在不同的位置(便宜)重新计算许多相同半径的圆(昂贵)。
对我来说优化它的一个简单方法是预先计算一个以零为中心的每个半径的圆,然后选择正确的圆并将其移动到正确的位置。这很简单,而且效果很好!
当试图访问这个圆查找表时,问题就来了。
我最初把它做成了一个持久变量,如下:
[x_subs, y_subs] = get_circle_indices(circ_radius, circ_x_center, circ_y_center)
persistent circle_lookup_table;
% Make sure the table's already been generated; if not, generate it.
if (isempty(circle_lookup_table))
circle_lookup_table = generate_circles(100); %upper bound circ size
end
% Get the right circle from the struct, and center it at the requested center
x_subs = circle_lookup_table(circ_radius).x_coords + circ_x_center;
y_subs = circle_lookup_table(circ_radius).y_coords + circ_y_center;
end
但是,事实证明这很慢! 超过 200,000 次函数调用,MATLAB 每次调用平均花费 9 微秒来确定持久变量的存在! (不是 isEmpty() 调用,而是实际的变量声明)。这是根据 MATLAB 的内置分析器。
这增加了从实现查找表中获得的大部分时间。
我还尝试将其实现为全局变量(类似的时间来检查变量是否已声明)或将其作为变量传递(使函数调用更加昂贵)。
所以,我的问题是:
如何在函数内部提供对运行时常量数据的快速访问?
我期待一些建议。
【问题讨论】:
标签: matlab