我正在实现(对于类,所以没有内置函数!)Hough变换的变体来检测图像中的圆圈。我有一个工作的产品,我得到了正确的结果。换句话说,我完成了作业!但是,我想更进一步,尝试稍微提高性能。另外,为了防止任何不可避免的响应,我知道MATLAB并不是最基于性能的语言,我知道Hough变换也不是基于性能的,但是请听我说。
当生成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的内置分析器。
这大部分时间都是从实现查找表中获得的。
我也尝试将它实现为一个全局变量(类似的时间检查是否声明了变量)或将其作为变量传递(使函数调用更加昂贵)。
所以,我的问题是:
如何在函数内快速访问运行时常量数据?
我期待一些建议。
答案 0 :(得分:1)
它不是运行时常量数据,因为您的函数具有生成表的能力。所以你的主要问题是从函数中丢弃这条指令。在调用此关键函数之前,请确保在函数外部的其他位置生成此数组。
然而,我从Matlab的文件中读到了一个很好的技巧,更具体地说是bwmorph
。对于需要LUT的这个特殊函数的每个功能,它们创建了一个返回LUT本身的函数(LUT在文件中明确地写入)。他们还添加了一条指令coder.inline('always')
,以确保内联此函数。这似乎非常有效!