Можно настроить алгоритм для операций поиска в таблице, поиска в индексе и создания кода. Если код, созданный для доступных параметров алгоритма, не соответствует требованиям приложения, создайте пользовательские записи таблицы замены кода для замены созданного кода алгоритма. Можно разработать библиотеку замены кода для оптимизации производительности алгоритмов в блоке таблицы поиска. Дополнительные сведения см. в разделе Разработка библиотеки замены кода. Дополнительные сведения об использовании блоков таблицы подстановки см. в разделе Нелинейность.
Чтобы создать записи таблицы замены кода для функции, соответствующей алгоритму таблицы подстановки, необходимо иметь:
Информация о сигнатуре концептуальной функции.
Соответствующие параметры алгоритма.
В этой таблице представлена информация о сигнатуре концептуальной функции.
| Подпись концептуальной функции | Сводка аргументов |
|---|---|
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 | y1 - выходu, u - пара индексов и дробей на измерение u - данные таблицыu - длины размеров таблицы |
Явные значения | y1 - выходu1 - входu2 - данные точки остановаu3 - данные таблицыu4 - длина размера таблицы |
Четный интервал | y1 - выходu1 - входu2 - первая точка данных точки остановаu3 - расстояние между точками остановаu4 - данные таблицыu5 - длина размера таблицы |
Явные значения | y1 - выходu1, u2 - входu3, u4 - данные точки остановаu5 - данные таблицыu6, u7 - длины размеров таблицы |
Четный интервал | y1 - выходu1, u2 - входu3, u5 - первая точка данных точки остановаu4, u6 - расстояние между точками остановаu7 - данные таблицыu8, u9 - длины размеров таблицы |
Явный интервал | y1 - выходu1, u2, u3 - входu4, u5, u6 - данные точки остановаu7 - данные таблицыu8, u9, u10 - длины размеров таблицы |
Четный интервал | y1 - выходu1, u2, u3 - входu4, u6, u8 - первая точка данных точки остановаu5, u7, u9 - расстояние между точками остановаu10 - данные таблицыu11, u12, u13 - длины размеров таблицы |
Явные значения | y1 - выходu1, u2, u3, u4 - входu5, u6, u7, u8 - данные точки остановаu9 - данные таблицыu10, u11, u12, u13 - длины размеров таблицы |
Четный интервал | y1 - выходu1, u2, u3, u4 - входu5, u7, u9, u11 - первая точка данных точки останова u6, u8, u10, u12 - расстояние между точками остановаu13 - данные таблицыu14, u15, u16, u17 - длины размеров таблицы |
Явные значения | y1 - выходu1, u2, u3, u4, u5 - входu6, u7, u8, u9, u10 - данные точки остановаu11 - данные таблицыu12, u13, u14, u15, u16 - длины размеров таблицы |
Четный интервал | y1 - выходu1, u2, u3, u4, u5 - входu6, u8, u10, u12, u14 - первая точка данных точки остановаu7, u9, u11, u13, u15 - расстояние между точками остановаu16 - данные таблицыu17, u18, u19, u20, u21 - длины размеров таблицы |
Явные значения | y1 - выходu, ввод на измерениеu, точка останова на размерu - данные таблицыu - длины размеров таблицы |
Четный интервал | y1 - выходu - вход на размерu - первая точка данных точки останова на измерениеu - шаг точки останова по размеруu - данные таблицыu - длины размеров таблицы |
y1 = lookupND_Direct(u1, u2,...ui, ui+1) | y1 - выходu1...ui - входui+1 - данные таблицы |
Явные значения | y1 - индексy2 - фракцияu1 - входu2 - данные точки остановаu3 - количество точек останова |
Равномерно разнесенные | y1 - индексy2 - фракцияu1 - входu2 - первая точка данных точки остановаu3 - расстояние между точками остановаu4 - количество точек останова |
При программном определении записи таблицы может потребоваться также изменить значения обязательных (первичных) и дополнительных параметров алгоритма.
Установите значения необходимых параметров для замены кода.
Если значение для дополнительного параметра не задано, применяется программное обеспечение параметра алгоритма don't care. Программа замены кода игнорирует параметр при поиске совпадений.
В этом примере показано, как указать запись таблицы замены кода для алгоритма таблицы подстановки interp1D с помощью инструмента замены кода.
Откройте инструмент замены кода (crtool) в командной строке MATLAB с помощью следующей команды:
>>crtool
Создайте таблицу.
В контекстном меню crtool выберите «Файл» > «Новая таблица».
На правой панели присвойте таблице имя crl_LUT. Нажмите кнопку «Применить».
Создайте запись. В контекстном меню crtool выберите «Файл» > «Новая запись» > «Функция».
Создание параметров записи. В раскрывающемся списке «Функция» выберите custom. Информация о функциях появляется в crtool. В этом примере укажите параметр как lookup1D . Установите параметры алгоритма, как показано в снимке crtool ниже.
Создайте концептуальное представление. Концептуальное представление описывает подпись функции, которую требуется заменить. В подразделе «Концептуальная функция» crtool укажите возвращаемый аргумент. y1и входной аргумент u1 с типом данных double и u4 , с типом данных uint32 и тип аргумента Scalar.
Укажите тип аргумента для входных аргументов u2 и u3 как Matrixи тип данных как double. Установите параметры алгоритма, как показано на рисунке ниже.
Создайте представление реализации. Представление реализации описывает сигнатуру функции оптимизации. Для этого примера, чтобы указать, что аргументы реализации имеют тот же порядок и те же свойства, что и концептуальные аргументы, установите флажок Сделать концептуальный и аргумент реализации типами одного и того же типа.
Добавление возвращаемого аргумента y1 и аргументы u1, u2, u3 и u4.
Укажите имя для функции замены в разделе Прототип функции.
Укажите сведения о построении. Щелкните вкладку Сведения о построении, чтобы открыть панель требований к построению. Укажите файлы (источник, заголовок, объект), необходимые генератору кода для замены кода. В этом примере нет необходимости указывать информацию о построении.
Проверьте и сохраните таблицу. Перейдите на вкладку «Информация о сопоставлении» и убедитесь, что поля заполнены, как показано на рисунке. Щелкните Проверить запись. В контекстном меню crtool выберите «Файл» > «Сохранить таблицу» > «Сохранить».

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

Чтобы использовать библиотеку замены кода, обновите текущий сеанс MATLAB с помощью команды:
>>sl_refresh_customizations
Проверьте библиотеку замены кода. В командной строке MATLAB откройте библиотеку с помощью средства просмотра замены кода и убедитесь, что таблица и запись указаны правильно. Дополнительные сведения см. в разделе Проверка библиотеки замены кода. Настройте модель так, чтобы она использовала библиотеку замены кода, создавала код и проверяла, что замена происходит так, как ожидалось. Если происходит непредвиденное поведение, проверьте попадание и пропустите журналы, чтобы устранить неполадки.
Откройте программный интерфейс в меню MATLAB, выбрав Создать > Функция.
Создайте таблицу.
Создайте функцию с именем таблицы библиотеки замены кода, которая не имеет аргументов и возвращает объект таблицы. Эту функцию можно использовать для вызова таблицы библиотеки замены кода.
Создание объекта таблицы путем вызова 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;
Создайте запись. Поскольку этот пример заменяет функцию, создайте запись замены кода в таблице, вызвав функцию записи. 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;
Создание параметров записи. Поскольку эти примеры заменяют функцию, создайте параметры записи, вызвав функцию 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');
Создайте концептуальное представление. Концептуальное представление описывает подпись функции, которую требуется заменить. Чтобы явно указать свойства аргумента, вызовите функцию 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);
Создайте представление реализации. Представление реализации описывает сигнатуру функции оптимизации. Чтобы указать, что аргументы реализации имеют тот же порядок и свойства, что и концептуальные аргументы, вызовите функцию 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);
Укажите сведения о построении. В параметрах ввода укажите файлы (заголовок, источник, объект), необходимые генератору кода для замены кода. Для этого примера информация о построении не требуется.
Проверьте и сохраните файл настройки. В меню MATLAB сохраните этот файл настройки, выбрав «Файл» > «Сохранить». В командной строке проверьте таблицу библиотеки замены кода, вызвав ее:
>> hTable = my_lookup_replacement_table
Зарегистрируйте библиотеку замены кода. Регистрация создает библиотеку замены кода, определяя имя библиотеки, таблицы замены кода и другую информацию. Создайте файл регистрации (новый файл функции) со следующими спецификациями:
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
Проверьте библиотеку замены кода. В командной строке MATLAB откройте библиотеку с помощью средства просмотра замены кода и убедитесь, что таблица и запись указаны правильно. Дополнительные сведения см. в разделе Проверка библиотеки замены кода. Настройте модель так, чтобы она использовала библиотеку замены кода, создавала код и проверяла, что замена происходит так, как ожидалось. Если происходит непредвиденное поведение, проверьте попадание и пропустите журналы, чтобы устранить неполадки.
В этом разделе создается код с использованием библиотеки замены кода, созданной в первых двух разделах этого примера. Функция таблицы подстановки заменяется вызовом пользовательской функции в сгенерированном коде. В этом примере не предусмотрена функция реализации. Напишите собственную реализацию.
Пример модели
Открытие модели crl_LUTfunction для конфигурирования библиотеки замены кода.
open_system('crl_LUTfunction'); copyfile LutFnRtwTargetInfo.txt rtwTargetInfo.m

Запустите файл адаптации MATLAB, чтобы создать таблицу замены кода и зарегистрировать файл. Файл настройки уже выполнен. Запустите функцию sl_refresh_customizations для загрузки библиотеки.
sl_refresh_customizations;
Включить библиотеку замены кода
Откройте диалоговое окно «Параметры конфигурации».
На панели «Интерфейс» установите значение «Библиотека замены кода», нажав кнопку «Выбрать» и добавив 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;