exponenta event banner

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

Этот пример показывает, как заменить пользовательскую функцию на функцию приближения интерполяционной таблицы использование функции codegen.

Предпосылки

Чтобы завершить этот пример, необходимо установить следующие продукты:

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

function y = custom_fcn(x)
  y = 1./(1+exp(-x));
end

Создайте функцию обертки, которая вызывает custom_fcn.m m.

function y = call_custom_fcn(x)
  y = custom_fcn(x);
end

Создайте тестовый файл, custom_test.m, который использует call_custom_fcn.m m.

close all

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

Создайте функциональный заменяющий объект настройки аппроксимировать custom_fcn. Задайте указатель на функцию пользовательской функции и установите число точек использовать в интерполяционной таблице для 50.

q = coder.approximation('Function','custom_fcn','CandidateFunction',@custom_fcn, 'NumberOfPoints',50);

Создайте объект coder.FixptConfig, fixptcfg. Укажите, что тестовый файл называет и включает тестирование численных данных. Сопоставьте функциональный заменяющий объект настройки с объектом настройки фиксированной точки.

fixptcfg = coder.config('fixpt');
fixptcfg.TestBenchName = 'custom_test';
fixptcfg.TestNumerics = true;
fixptcfg.addApproximation(q);

Сгенерируйте фиксированную точку код MATLAB.

codegen -float2fixed fixptcfg call_custom_fcn

codegen генерирует фиксированную точку код MATLAB в call_custom_fcn_fixpt.m m.

Чтобы просмотреть сгенерированную фиксированную точку, щелкните по ссылке к call_custom_fcn_fixpt.

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

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

function y = call_custom_fcn_fixpt(x)
  fm = get_fimath();

  y = fi(replacement_custom_fcn(x), 0, 14, 14, fm);
end

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