2014-01-10 5 views
2

Я реализую (для класса, так что нет встроенных!) Вариант преобразования Hough для определения окружностей на изображении. У меня есть рабочий продукт, и я получаю правильные результаты. Другими словами, я закончил задание! Тем не менее, я хотел бы сделать это еще на один шаг и попытаться немного улучшить производительность. Кроме того, чтобы предотвратить любые неизбежные ответы, я знаю, что MATLAB - это не совсем язык, основанный на характеристиках, и я знаю, что преобразование Hough не является точно основано на производительности, но выслушайте меня.Внедрение постоянных постоянных «LUT» в MATLAB-функциях

При создании пространства накопления Hough мне нужно нарисовать LOT кругов (приблизительно 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

Это НЕ постоянная информация, так как ваша функция способна генерировать таблицу. Поэтому ваша главная проблема - отказаться от этой инструкции от функции. Перед всеми вызовами этой критической функции убедитесь, что этот массив создается в другом месте вне функции.

Однако есть хороший трюк, который я прочитал из файлов Matlab, а точнее bwmorph. Для каждой функциональности этой особенной функции, которая требует LUT, они создали функцию, которая возвращает сам LUT (LUT записывается явно в файл). Они также добавляют команду coder.inline('always'), чтобы убедиться, что эта функция будет встроена. Кажется, это очень эффективно!

+0

Благодарим за отзыв! Какую версию MATLAB вы используете? В моей (студенческой лицензии) R2012a я не могу найти этот пример в моей копии bwmorph! Кроме того, похоже, что они должны будут восстановить LUT при каждом вызове функции - я хочу, чтобы один и тот же LUT сохранялся через каждый вызов функции без регенерации. – Glenn

+0

@Glenn У вас есть Image Processing Toolbox?К самому файлу можно получить доступ, если вы введете 'bwmorph' в командном окне, затем выберите его и нажмите' Ctrl + D'. В файле интересной функцией является 'images.internal.algbwmorph'. Нажмите еще раз 'Ctrl + D', и вы находитесь в файле, который вызывает luts, так что вы можете сделать свой выбор :) – Bentoy13

+0

@Glenn Что касается генерации LUT, я думаю, что из-за команды inlining LUT может не быть каждый раз восстанавливался ... но я не нашел доказательств этого. – Bentoy13

Смежные вопросы