【问题标题】:Implementing runtime-constant persistent "LUT"s in MATLAB functions在 MATLAB 函数中实现运行时恒定的持久“LUT”
【发布时间】: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() 调用,而是实际的变量声明)。这是根据 MA​​TLAB 的内置分析器。

这增加了从实现查找表中获得的大部分时间。

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

所以,我的问题是:

如何在函数内部提供对运行时常量数据的快速访问?

我期待一些建议。

【问题讨论】:

    标签: matlab


    【解决方案1】:

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

    但是,我从 Matlab 的文件中读到了一个不错的技巧,更具体地说是 bwmorph。对于这个需要 LUT 的特定功能的每个功能,他们创建了一个返回 LUT 本身的函数(LUT 明确地写在文件中)。他们还添加了一条指令coder.inline('always') 以确保该函数将被内联。好像还挺有效率的!

    【讨论】:

    • 感谢您的回复!您使用的是哪个版本的 MATLAB?在我的(学生许可)R2012a 中,我在我的 bwmorph 副本中找不到这个示例!此外,听起来他们必须在每个函数调用上重新生成 LUT - 我希望相同的 LUT 在每个函数调用中持续存在而不被重新生成。
    • @Glenn 你有图像处理工具箱吗?如果您在命令窗口中键入bwmorph,则可以访问该文件本身,然后选择它并按Ctrl+D。在文件中,有趣的函数是images.internal.algbwmorph。再次按下Ctrl+D,您将进入调用 luts 的文件中,因此您可以做出选择:)
    • @Glenn 关于 LUT 的生成,我认为由于内联指令,LUT 可能不会每次都重新生成......但我没有找到任何证据。
    • 在正常情况下,这并不符合我对函数内联的理解,但我必须试一试。我还查看了我的 bwmorph 副本(是的,我有 2012a 工具箱),我没有看到对 coder.inline 或 images.internal.algbwmorph 的引用。
    • 另外,从 coder.inline() 的 MATLAB 文档中,它看起来好像只是 MATLAB 编码器(我没有使用)在生成的代码中内联函数的指令,而不是在解释运行期间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多