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

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

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

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

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

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

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

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

Создайте тестовый файл, custom_test.m, который использует call_custom_fcn.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.

Чтобы просмотреть сгенерированный код фиксированной точки, щелкните ссылку на 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. Если поведение сгенерированного кода с фиксированной точкой недостаточно тесно совпадает с поведением оригинального кода, измените метод интерполяции или число точек, используемых в интерполяционной таблице, и затем перегенерируйте код.