在MATLAB函数中实现运行时常量持久性“LUT”

时间:2014-01-10 13:41:29

标签: matlab

我正在实现(对于类,所以没有内置函数!)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的内置分析器。

这大部分时间都是从实现查找表中获得的。

我也尝试将它实现为一个全局变量(类似的时间检查是否声明了变量)或将其作为变量传递(使函数调用更加昂贵)。

所以,我的问题是:

如何在函数内快速访问运行时常量数据?

我期待一些建议。

1 个答案:

答案 0 :(得分:1)

它不是运行时常量数据,因为您的函数具有生成表的能力。所以你的主要问题是从函数中丢弃这条指令。在调用此关键函数之前,请确保在函数外部的其他位置生成此数组。

然而,我从Matlab的文件中读到了一个很好的技巧,更具体地说是bwmorph。对于需要LUT的这个特殊函数的每个功能,它们创建了一个返回LUT本身的函数(LUT在文件中明确地写入)。他们还添加了一条指令coder.inline('always'),以确保内联此函数。这似乎非常有效!