exponenta event banner

Замена кода функции таблицы подстановки

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

Сигнатуры функций таблицы подстановки

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

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

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

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

Подпись концептуальной функцииСводка аргументов
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({ui, uf,}... ut, un...)y1 - выход
ui, uf - пара индексов и дробей на измерение
ut - данные таблицы
un - длины размеров таблицы

Явные значения
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(un,..., ub,..., ut, un...)

y1 - выход
un, ввод на измерение
ub, точка останова на размер
ut - данные таблицы
un - длины размеров таблицы

Четный интервал
y1 = lookupND(un,..., {ufn, usn,}... ut, un...)

y1 - выход
un - вход на размер
ufn - первая точка данных точки останова на измерение
usn - шаг точки останова по размеру
ut - данные таблицы
un - длины размеров таблицы
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. Откройте инструмент замены кода (crtool) в командной строке MATLAB с помощью следующей команды:

    >>crtool
  2. Создайте таблицу.

    1. В контекстном меню crtool выберите «Файл» > «Новая таблица».

    2. На правой панели присвойте таблице имя crl_LUT. Нажмите кнопку «Применить».

  3. Создайте запись. В контекстном меню crtool выберите «Файл» > «Новая запись» > «Функция».

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

  5. Создайте концептуальное представление. Концептуальное представление описывает подпись функции, которую требуется заменить. В подразделе «Концептуальная функция» crtool укажите возвращаемый аргумент. y1и входной аргумент u1 с типом данных double и u4 , с типом данных uint32 и тип аргумента Scalar.

    Укажите тип аргумента для входных аргументов u2 и u3 как Matrixи тип данных как double. Установите параметры алгоритма, как показано на рисунке ниже.

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

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

    Укажите имя для функции замены в разделе Прототип функции.

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

  8. Проверьте и сохраните таблицу. Перейдите на вкладку «Информация о сопоставлении» и убедитесь, что поля заполнены, как показано на рисунке. Щелкните Проверить запись. В контекстном меню crtool выберите «Файл» > «Сохранить таблицу» > «Сохранить».

  9. Зарегистрируйте библиотеку замены кода. При регистрации создается библиотека, состоящая из указанных таблиц. Выберите «Файл» > «Создать файл регистрации». В диалоговом окне Создать файл регистрации заполните следующие поля:

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

    >>sl_refresh_customizations

  10. Проверьте библиотеку замены кода. В командной строке MATLAB откройте библиотеку с помощью средства просмотра замены кода и убедитесь, что таблица и запись указаны правильно. Дополнительные сведения см. в разделе Проверка библиотеки замены кода. Настройте модель так, чтобы она использовала библиотеку замены кода, создавала код и проверяла, что замена происходит так, как ожидалось. Если происходит непредвиденное поведение, проверьте попадание и пропустите журналы, чтобы устранить неполадки.

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

  1. Откройте программный интерфейс в меню MATLAB, выбрав Создать > Функция.

  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. Создайте запись. Поскольку этот пример заменяет функцию, создайте запись замены кода в таблице, вызвав функцию записи. 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 сохраните этот файл настройки, выбрав «Файл» > «Сохранить». В командной строке проверьте таблицу библиотеки замены кода, вызвав ее:

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

Создание кода с помощью библиотеки замены кода таблицы подстановки

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

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

Открытие модели 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;

Связанные темы