Замените пользовательскую функцию интерполяционной таблицей

В этом примере показано, как заменить пользовательскую функцию на функцию приближения интерполяционной таблицы с помощью MATLAB® Coder™ приложение.

Необходимые условия

Этот пример требует следующих продуктов:

Создайте алгоритм и тестовые файлы

В локальной папке с возможностью записи:

  1. Создайте функцию MATLAB, custom_fcn.m которая является функцией, которую вы хотите заменить.

    function y = custom_fcn(x)
        y = 1./(1+exp(-x));
    end
  2. Создайте функцию обертки, call_custom_fcn.m, который вызывает custom_fcn.m.

    function y = call_custom_fcn(x)
        y = custom_fcn(x);
    end
  3. Создайте тестовый файл, custom_test.m, который использует call_custom_fcn.

    close all
    clear all
    
    x = linspace(-10,10,1e3);
    for itr = 1e3:-1:1
       y(itr) = call_custom_fcn( x(itr) );
    end
    plot( x, y );
    

Откройте приложение MATLAB Coder

  1. Перейдите к рабочей папке, содержащей файл для этого примера.

  2. На вкладке Apps MATLAB Toolstrip, в разделе Code Generation, щелкните значок приложения.

Выбор исходных файлов

Чтобы добавить функцию точки входа call_custom_fcn в проект перейдите к файлу call_custom_fcn.m, а затем нажмите Open. По умолчанию приложение сохраняет информацию и настройки для этого проекта в текущей папке в файле с именем call_custom_fcn.prj.

Включите преобразование с фиксированной точкой

  1. Установите Numeric Conversion значение Convert to fixed point.

  2. Щелкните Next, чтобы перейти к Define Input Types шагу.

    Окно приложения call_custom_fcn.m для нарушений кода и проблем генерации кода. Приложение открывает страницу Review Code Generation Readiness.

Проверьте готовность генерации кода

  1. Нажмите Review Issues. Приложение указывает, что exp функция не поддерживается для преобразования с фиксированной точкой. Можно игнорировать это предупреждение, так как вы собираетесь заменить custom_fcn, которая является функцией, которая вызывает exp.

  2. Щелкните Next, чтобы перейти к Define Input Types шагу.

Определите входные типы

  1. Добавить custom_test в качестве тестового файла и затем нажмите Autodefine Input Types.

    Тестовый файл запускается. Приложение определяет из тестового файла, что x является скалярным двойником.

  2. Щелкните Next, чтобы перейти к Check for Run-Time Issues шагу.

Проверяйте на наличие проблем во время выполнения

На Check for Run-Time Issues шаге генерируется MEX с инструментами. Он запускает тестовый файл custom_test замена вызовов на call_custom_fcn с вызовами сгенерированной MEX-функции. Если приложение находит проблемы, оно выдает предупреждения и сообщения об ошибке. Вы можете кликнуть сообщение, чтобы выделить проблемный код в панели, где можно отредактировать код.

  1. На странице Check for Run-Time Issues приложение заполняет поле тестового файла именем custom_test, тестовый файл, который вы использовали для определения типов входа.

  2. Нажмите Check for Issues.

    Приложение не обнаруживает проблем.

  3. Щелкните Next, чтобы перейти к Convert to Fixed Point шагу.

Замените custom_fcn на интерполяционную таблицу

  1. Выберите вкладку Function Replacements.

    Приложение указывает, что вы должны заменить exp функция.

  2. Введите имя функции, custom_fcn, выберите Lookup Table, а затем нажмите.

    Приложение добавляет custom_fcn к списку функций, которые будут заменены интерполяционной таблицей. По умолчанию в интерполяционной таблице используется линейная интерполяция и 1000 точек. Приложение устанавливает Design Min и Design Max на Auto что означает, что приложение использует минимальное и максимальное значения проекта, которые оно обнаруживает путем выполнения симуляции или вычисления производных областей значений.

  3. Щелкните стрелку Analyze, выберите Log data for histogram и проверьте, что тестовый файл call_custom_test.

  4. Нажмите Analyze.

    Симуляция выполняется. Приложение отображает минимальные и максимальные области значений симуляции на вкладке Variables. Используя данные области значений симуляции, программное обеспечение предлагает фиксированные точки для каждой переменной на основе настроек предложения по типу по умолчанию и отображает их в столбце Proposed Type. Опция Convert теперь включена.

  5. Исследуйте предлагаемые типы и проверьте, что они охватывают полную область значений симуляции. Чтобы просмотреть записанные данные гистограммы для переменной, щелкните поле Proposed Type. Гистограмма предоставляет информацию о области значений и процентном отношении области симуляций, охватываемой предложенным типом данных.

Преобразуйте в фиксированную точку

  1. Нажмите Convert.

    Приложение проверяет предлагаемые типы и генерирует версию с фиксированной точкой функции точки входа, call_custom_fcn_fixpt.m.

  2. В списке Output Files выберите call_custom_fcn_fixpt.m.

    Процесс преобразования генерирует приближение интерполяционной таблицы, replacement_custom_fcn, для custom_fcn функция. Процесс преобразования с фиксированной точкой выводит области значений для функции, а затем использует интерполированную интерполированную интерполяционную таблицу, чтобы заменить функцию. По умолчанию в интерполяционной таблице используется линейная интерполяция, 1000 точек и минимальные и максимальные значения, обнаруженные при запуске тестового файла.

    Сгенерированная функция с фиксированной точкой, call_custom_fcn_fixpt.m, вызывает это приближение вместо вызова custom_fcn.

    function y = call_custom_fcn_fixpt(x)
        fm = get_fimath();
    
        y = fi(replacement_custom_fcn(x), 0, 16, 16, fm);
    end

    Теперь можно протестировать сгенерированный код с фиксированной точкой и сравнить результаты с исходной функцией MATLAB. Если поведение сгенерированного кода с фиксированной точкой недостаточно тесно совпадает с поведением оригинального кода, измените метод интерполяции или число точек, используемых в интерполяционной таблице, и затем перегенерируйте код.