Замена кода функции интерполяционной таблицы

Можно сконфигурировать алгоритм для операций поиска по таблице и поиска по индексу и сгенерировать код. Если код, сгенерированный для доступных опций алгоритма, не соответствует требованиям к вашему приложению, создайте пользовательские записи таблицы замещения кода, чтобы заменить сгенерированный код алгоритма. Можно разработать библиотеку замещения кода, чтобы оптимизировать эффективность алгоритмов в блоке интерполяционной таблицы. Для получения дополнительной информации см. раздел «Разработка библиотеки замещения кода». Дополнительные сведения об использовании блоков интерполяционной таблицы см. в разделе Нелинейность.

Сигнатуры функции интерполяционной таблицы

Чтобы создать записи таблицы замещения кода для функции, соответствующей алгоритму интерполяционной таблицы, вы должны иметь:

  • Информация о концептуальной сигнатуре функции.

  • Соответствующие параметры алгоритма.

В этой таблице представлена информация о концептуальной сигнатуре функции.

Концептуальная сигнатура функцииСводные данные аргументов
y1 = interp1D(u1, u2, u3, u4)y1 - выход
u1 - индекс
u2 - дробь
u3 - данные таблицы
u4 - длина размерности таблицы
y1 = interp2D(u1, u2, u3, u4, u5, u6, u7)y1 - выход
u1, u3 - индекс
u2, u4 - дробь
u5 - данные таблицы
u6, u7 - длины размерностей таблицы
y1 = interp3D(u1, u2, u3, u4, u5, u6, u7, u8, u9, u10)y1 - выход
u1, u3, u5 - индекс
u2, u4, u6 - дробь
u7 - данные таблицы
u8, u9, u10 - длины размерностей таблицы
y1 = interp4D(u1, u2, u3, u4, u5, u6, u7, u8, u9, u10, u11, u12, u13)y1 - выход
u1, u3, u5, u7 - индекс
u2, u4, u6, u8 - дробь
u9 - данные таблицы
u10, u11, u12, u13 - длины размерностей таблицы
y1 = interp5D(u1, u2, u3, u4, u5, u6, u7, u8, u9, u10, u11, u12, u13, u14, u15, u16)y1 - выход
u1, u3, u5, u7, u9 - индекс
u2, u4, u6, u8, u10 - дробь
u11 - данные таблицы
u12, u13, u14, u15, u16 - длины размерностей таблицы
y1 = interpND ({u i, u f,}... u t, u n...)y1 - выход
u i, u f - пара индексов и дробей на размерность
u t - данные таблицы
u n - длины размерностей таблицы

Явные значения
y1 = lookup1D(u1, u2, u3, u4)

y1 - выход
u1 - вход
u2 - данные точек по оси Х
u3 - данные таблицы
u4 - длина размерности таблицы

Четный интервал
y1 = lookup1D(u1, u2, u3, u4, u5)

y1 - выход
u1 - вход
u2 - первая точка данных точек по оси Х
u3 - интервалы между точками останова
u4 - данные таблицы
u5 - длина размерности таблицы

Явные значения
y1 = lookup2D(u1, u2, u3, u4, u5, u6, u7)

y1 - выход
u1, u2 - вход
u3, u4 - данные точек по оси Х
u5 - данные таблицы
u6, u7 - длины размерностей таблицы

Четный интервал
y1 = lookup2D(u1, u2, u3, u4, u5, u6, u7, u8, u9)

y1 - выход
u1, u2 - вход
u3, u5 - первая точка данных точек по оси Х
u4, u6 - интервалы между точками останова
u7 - данные таблицы
u8, u9 - длины размерностей таблицы

Явный интервал
y1 = lookup3D(u1, u2, u3, u4, u5, u6, u7, u8, u9, u10)

y1 - выход
u1, u2, u3 - вход
u4, u5, u6 - данные точек по оси Х
u7 - данные таблицы
u8, u9, u10 - длины размерностей таблицы

Четный интервал
y1 = lookup3D(u1, u2, u3, u4, u5, u6, u7, u8, u9, u10, u11, u12, u13)

y1 - выход
u1, u2, u3 - вход
u4, u6, u8 - первая точка данных точек по оси Х
u5, u7, u9 - интервалы между точками останова
u10 - данные таблицы
u11, u12, u13 - длины размерностей таблицы

Явные значения
y1 = lookup4D(u1, u2, u3, u4, u5, u6, u7, u8, u9, u10, u11, u12, u13)

y1 - выход
u1, u2, u3, u4 - вход
u5, u6, u7, u8 - данные точек по оси Х
u9 - данные таблицы
u10, u11, u12, u13 - длины размерностей таблицы

Четный интервал
y1 = lookup4D(u1, u2, u3, u4, u5, u6, u7, u8, u9, u10, u11, u12, u13, u14, u15, u16, u17)

y1 - выход
u1, u2, u3, u4 - вход
u5, u7, u9, u11 - первая точка данных точек по оси Х
u6, u8, u10, u12 - интервалы между точками останова
u13 - данные таблицы
u14, u15, u16, u17 - длины размерностей таблицы

Явные значения
y1 = lookup5D(u1, u2, u3, u4, u5, u6, u7, u8, u9, u10, u11, u12, u13, u14, u15, u16)

y1 - выход
u1, u2, u3, u4, u5 - вход
u6, u7, u8, u9, u10 - данные точек по оси Х
u11 - данные таблицы
u12, u13, u14, u15, u16 - длины размерностей таблицы

Четный интервал
y1 = lookup5D(u1, u2, u3, u4, u5, u6, u7, u8, u9, u10, u11, u12, u13, u14, u15, u16, u17, u18, u19, u20, u21)

y1 - выход
u1, u2, u3, u4, u5 - вход
u6, u8, u10, u12, u14 - первая точка данных точек по оси Х
u7, u9, u11, u13, u15 - интервалы между точками останова
u16 - данные таблицы
u17, u18, u19, u20, u21 - длины размерностей таблицы

Явные значения
y1 = lookupND (u n,..., u b,..., u t, u n...)

y1 - выход
u n, вход по размерности
u b, точек по размерности
u t - данные таблицы
u n - длины размерностей таблицы

Четный интервал
y1 = lookupND (u n,..., {u fn, u sn,}... u t, u n...)

y1 - выход
u n - вход по размерности
u fn - первая точка данных точек по размерности
u sn - интервалы точек по размерности
u t - данные таблицы
u n - длины размерностей таблицы
y1 = lookupND_Direct(u1, u2,...ui, ui+1)y1 - выход
u1...ui - вход
ui+1 - данные таблицы

Явные значения
y1, y2 = prelookup(u1, u2, u3)

y1 - индекс
y2 - дробь
u1 - вход
u2 - данные точек по оси Х
u3 - количество точек останова

Равномерно разнесенный
y1, y2 = prelookup(u1, u2, u3, u4)

y1 - индекс
y2 - дробь
u1 - вход
u2 - первая точка данных точек по оси Х
u3 - интервалы между точками останова
u4 - количество точек останова

При программном определении записи таблицы может потребоваться изменить значения обязательных (первичных) и необязательных параметров алгоритма.

  • Установите значения необходимых параметров для замены кода.

  • Если вы не задаете значение для необязательного параметра, применяется программное обеспечение параметра алгоритма don't care. Программа замены кода игнорирует параметр при поиске совпадений.

Интерактивная разработка библиотеки замещения кода

В этом примере показано, как задать запись таблицы замещения кода для алгоритма интерполяционной таблицы interp1D при помощи инструмента замены кода.

  1. Откройте Code Replacement Tool (crtool) из командной строки MATLAB с помощью следующей команды:

    >>crtool
  2. Составьте таблицу.

    1. В контекстном меню crtool выберите File > New Table.

    2. На правой панели назовите таблицу crl_LUT. Нажмите Apply.

  3. Создайте запись. В контекстном меню crtool выберите File > New entry > Function.

  4. Создайте параметры входа. В раскрывающемся списке Function выберите custom. Информация о функции появится в crtool. В данном примере задайте параметр следующим lookup1D . Установите параметры алгоритма, как показано на снимке crtool ниже.

  5. Создайте концептуальное представление. Концептуальное представление описывает сигнатуру функции, которую вы хотите заменить. В Conceptual function подразделе crtool задайте возвращаемый аргумент y1и входной параметр u1 с Data Type double и u4 , с Data Type uint32 и Argument Type Scalar.

    Задайте Argument Type входных параметров u2 и u3 как Matrixи Data Type как double. Установите Algorithm parameters как показано на рисунке ниже.

  6. Создайте представление реализации. Представление реализации описывает сигнатуру оптимизационной функции. В данном примере, чтобы указать, что аргументы реализации имеют тот же порядок и свойства, что и концептуальные аргументы, установите флажок Make conceptual and implementation argument types the same.

    Добавьте возвращаемый аргумент y1 и аргументы u1, u2, u3 и u4.

    Задайте Name для функции замены под Function prototype.

  7. Укажите сведения о сборке. Перейдите на вкладку Build Information, чтобы открыть панель Requirements к сборке. Укажите файлы (источник, заголовок, объект), которые требуется генератору кода для замены кода. В данном примере вам не нужно указывать информацию о сборке.

  8. Проверьте и сохраните таблицу. Щелкните вкладку Mapping Information и проверьте заполнение полей как показано на рисунке. Нажмите Validate entry. В контекстном меню crtool выберите File > Save table > Save.

  9. Зарегистрируйте библиотеку замещения кода. Регистрация создает библиотеку, состоящую из заданных таблиц. Выберите File > Generate registration file. В диалоговом окне Сгенерировать файл регистрации заполните следующие поля:

    Чтобы использовать библиотеку замены кода, обновите текущий сеанс работы с MATLAB командой:

    >>sl_refresh_customizations

  10. Проверьте библиотеку замещения кода. Из командной строки MATLAB откройте библиотеку с помощью Code Replacement Viewer и проверьте, что таблица и запись заданы правильно. Дополнительные сведения см. в разделе Проверка библиотеки замещения кода. Сконфигурируйте модель, чтобы использовать библиотеку замены кода, сгенерировать код и проверить, что замена происходит должным образом. Если происходит непредвиденное поведение, исследуйте журналы попадания и пропуска, чтобы устранить проблемы.

Программно разрабатывайте библиотеку замещения кода

  1. Откройте программный интерфейс из меню MATLAB, выбрав New > Function.

  2. Составьте таблицу.

    1. Создайте функцию с именем таблицы библиотеки замещения кода, которая не имеет аргументов и возвращает объект таблицы. Можно использовать эту функцию для вызова таблицы библиотеки замещения кода.

    2. Создайте объект таблицы путем вызова RTW.TflTable.

    function hTable = my_lookup_replacement_table
    % Create a function to call the code replacement library table 
    
    %% Create a table object
    hTable = RTW.TflTable;
    
  3. Создайте запись. Поскольку этот пример заменяет функцию, создайте запись замены кода в вашей таблице, вызвав функцию entry RTW.TflCFunctionEntry.

    function hTable = my_lookup_replacement_table
    % Create a code replacement library table 
    
    %% Create a table object
    hTable = RTW.TflTable;
    
    %% Create an entry
    hEntry = RTW.TflCFunctionEntry;
    
  4. Создайте параметры входа. Поскольку эти примеры заменяют функцию, создайте параметры входа путем вызова функции setTflCFunctionEntryParameters.

    function hTable = my_lookup_replacement_table()
    % Create a code replacement library table 
    
    %% Create a table object
    hTable = RTW.TflTable;
    
    %% Create an entry
    hEntry = RTW.TflCFunctionEntry;
    
    %% Create entry parameters
    setTflCFunctionEntryParameters(hEntry, ...
              'Key',                      'lookup1D', ...
              'Priority',                 100, ...
              'ImplementationName',       'my_Lookup1D_Repl', ...
              'ImplementationHeaderFile', 'myLookup1D.h', ...
              'ImplementationSourceFile', 'myLookup1D.c', ...
              'GenCallback',              'RTW.copyFileToBuildDir');
  5. Создайте концептуальное представление. Концептуальное представление описывает сигнатуру функции, которую вы хотите заменить. Чтобы явным образом задать свойства аргумента, вызовите функцию getTflArgFromString.

    function hTable = my_lookup_replacement_table()
    % Create a code replacement library table 
    
    %% Create a table object
    hTable = RTW.TflTable;
    
    %% Create an entry
    hEntry = RTW.TflCFunctionEntry;
    
    %% Create entry parameters
    setTflCFunctionEntryParameters(hEntry, ...
              'Key',                      'lookup1D', ...
              'Priority',                 100, ...
              'ImplementationName',       'my_Lookup1D_Repl', ...
              'ImplementationHeaderFile', 'myLookup1D.h', ...
              'ImplementationSourceFile', 'myLookup1D.c', ...
              'GenCallback',              'RTW.copyFileToBuildDir');
    
    %% Create the conceptual representation
    arg = hEntry.getTflArgFromString('y1','double');
    arg.IOType = 'RTW_IO_OUTPUT';
    addConceptualArg(hEntry, arg);
    
    arg = hEntry.getTflArgFromString('u1','double');
    addConceptualArg(hEntry, arg);
    
    arg = RTW.TflArgMatrix('u2', 'RTW_IO_INPUT',  'double');
    arg.DimRange = [0 0; Inf Inf];
    addConceptualArg(hEntry, arg);
    
    arg = RTW.TflArgMatrix('u3', 'RTW_IO_INPUT',  'double');
    arg.DimRange = [0 0; Inf Inf];
    addConceptualArg(hEntry, arg);
    
    arg = hEntry.getTflArgFromString('u4','uint32');
    addConceptualArg(hEntry, arg);
          
  6. Создайте представление реализации. Представление реализации описывает сигнатуру оптимизационной функции. Чтобы указать, что аргументы реализации имеют тот же порядок и свойства, что и концептуальные аргументы, вызовите функцию getTflArgFromString.

    function hTable = my_lookup_replacement_table()
    % Create a code replacement library table 
    
    %% Create a table object
    hTable = RTW.TflTable;
    
    %% Create an entry
    hEntry = RTW.TflCFunctionEntry;
    
    %% Create entry parameters
    setTflCFunctionEntryParameters(hEntry, ...
              'Key',                      'lookup1D', ...
              'Priority',                 100, ...
              'ImplementationName',       'my_Lookup1D_Repl', ...
              'ImplementationHeaderFile', 'myLookup1D.h', ...
              'ImplementationSourceFile', 'myLookup1D.c', ...
              'GenCallback',              'RTW.copyFileToBuildDir');
    
    %% Create the conceptual representation
    arg = hEntry.getTflArgFromString('y1','double');
    arg.IOType = 'RTW_IO_OUTPUT';
    addConceptualArg(hEntry, arg);
    
    arg = hEntry.getTflArgFromString('u1','double');
    addConceptualArg(hEntry, arg);
    
    arg = RTW.TflArgMatrix('u2', 'RTW_IO_INPUT',  'double');
    arg.DimRange = [0 0; Inf Inf];
    addConceptualArg(hEntry, arg);
    
    arg = RTW.TflArgMatrix('u3', 'RTW_IO_INPUT',  'double');
    arg.DimRange = [0 0; Inf Inf];
    addConceptualArg(hEntry, arg);
    
    arg = hEntry.getTflArgFromString('u4','uint32');
    addConceptualArg(hEntry, arg);
    
    algParams = getAlgorithmParameters(hEntry);   
    algParams.InterpMethod = 'Linear';
    algParams.ExtrapMethod = 'Clip';
    algParams.UseRowMajorAlgorithm = 'off';
    algParams.RndMeth = 'Round';
    algParams.IndexSearchMethod = 'Linear search';
    algParams.UseLastTableValue = 'off';
    algParams.RemoveProtectionInput = 'off';
    algParams.SaturateOnIntegerOverflow = 'off';
    algParams.SupportTunableTableSize = 'off';
    algParams.BPPower2Spacing = 'off';
    setAlgorithmParameters(hEntry, algParams);
    
    
    %% Create the Implementation Representation  
    arg = hEntry.getTflArgFromString('y1','double');
    arg.IOType = 'RTW_IO_OUTPUT';
    hEntry.Implementation.setReturn(arg); 
    
    arg = hEntry.getTflArgFromString('u1','double');
    hEntry.Implementation.addArgument(arg);
    
    arg = hEntry.getTflArgFromString('u2','double*');
    hEntry.Implementation.addArgument(arg);
    
    arg = hEntry.getTflArgFromString('u3','double*');
    hEntry.Implementation.addArgument(arg);
    
    arg = hEntry.getTflArgFromString('u4','uint32');
    hEntry.Implementation.addArgument(arg);
    
    %% Add the entry to the table
    hTable.addEntry(hEntry);
    
  7. Укажите сведения о сборке. В параметрах входа укажите файлы (заголовок, источник, объект), которые нужны генератору кода для замены кода. В данном примере информация о сборке не требуется.

  8. Проверьте и сохраните файл индивидуальной настройки. В меню MATLAB сохраните этот файл индивидуальной настройки, выбрав File > Save. В командной строке проверьте таблицу библиотеки замещения кода, вызвав ее:

    >> hTable = my_lookup_replacement_table
  9. Зарегистрируйте библиотеку замещения кода. Регистрация создает библиотеку замещения кода путем определения имени библиотеки, таблиц замещения кода и другой информации. Создайте файл регистрации (новый файл функции) с этими спецификациями:

    function rtwTargetInfo(cm)
     
    cm.registerTargetInfo(@loc_register_crl);
    end
     
    function this = loc_register_crl 
     
    this(1) = RTW.TflRegistry; 
    this(1).Name = 'CRL for LUT 1D function replacement’;
    this(1).TableList = {'my_lookup_replacement_table.m'}; % table created in this example
    this(1).TargetHWDeviceType = {'*'};
    this(1).Description = 'Example code replacement library';
    
    end
    

    Чтобы использовать библиотеку замены кода, обновите текущий сеанс работы с MATLAB командой:

    >>sl_refresh_customizations

  10. Проверьте библиотеку замещения кода. Из командной строки MATLAB откройте библиотеку с помощью Code Replacement Viewer и проверьте, что таблица и запись заданы правильно. Дополнительные сведения см. в разделе Проверка библиотеки замещения кода. Сконфигурируйте модель, чтобы использовать библиотеку замены кода, сгенерировать код и проверить, что замена происходит должным образом. Если происходит непредвиденное поведение, исследуйте журналы попадания и пропуска, чтобы устранить проблемы.

Сгенерируйте код при помощи библиотеки замещения кода интерполяционной таблицы

В этом разделе вы генерируете код с помощью библиотеки замены кода, которую вы создали в первых двух разделах этого примера. Функция интерполяционной таблицы заменяется вызовом пользовательской функции в сгенерированном коде. Этот пример не предоставляет функцию реализации. Напишите свою собственную реализацию.

Пример модели

Откройте модель crl_LUTfunction для настройки библиотеки замещения кода.

open_system('crl_LUTfunction');

copyfile LutFnRtwTargetInfo.txt rtwTargetInfo.m

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

sl_refresh_customizations;

Включите библиотеку замещения кода

  1. Откройте диалоговое окно Параметры конфигурации.

  2. На панели Интерфейс установите библиотеку замещения кода нажав Выбрать и добавить CRL for LUT function replacement к библиотекам замены выбранного кода - приоритетная панель списка.

%
% Alternatively, use the command-line API to enable the code replacement:
set_param('crl_LUTfunction', 'CodeReplacementLibrary', 'CRL for LUT function replacement');

Сгенерируйте код из модели:

evalc('slbuild(bdroot)');

Просмотрите сгенерированный код. Вот фрагмент crl_LUTfunction.c.

cfile = fullfile('crl_LUTfunction_ert_rtw','crl_LUTfunction.c');
rtwdemodbtype(cfile,'/* Model step function ','/* Model initialize function',1, 1);
/* Model step function */
void crl_LUTfunction_step(void)
{
  int32_T iU;

  /* Lookup_n-D: '<Root>/1-D Lookup Table2' incorporates:
   *  Constant: '<Root>/Constant2'
   */
  for (iU = 0; iU < 9; iU++) {
    crl_LUTfunction_Y.Y1[iU] = my_Lookup1D_Repl
      (crl_LUTfunction_ConstP.Constant2_Value[iU],
       &crl_LUTfunction_ConstP.uDLookupTable2_bp01Data[0],
       &crl_LUTfunction_ConstP.uDLookupTable2_tableData[0], 10U);
  }

  /* End of Lookup_n-D: '<Root>/1-D Lookup Table2' */
}

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

Закройте модель и отчет о генерации кода.

delete ./rtwTargetInfo.m
bdclose('crl_LUTfunction');
rtwdemoclean;

Похожие темы