Можно сконфигурировать алгоритм для операций поиска по таблице и поиска по индексу и сгенерировать код. Если код, сгенерированный для доступных опций алгоритма, не соответствует требованиям к вашему приложению, создайте пользовательские записи таблицы замещения кода, чтобы заменить сгенерированный код алгоритма. Можно разработать библиотеку замещения кода, чтобы оптимизировать эффективность алгоритмов в блоке интерполяционной таблицы. Для получения дополнительной информации см. раздел «Разработка библиотеки замещения кода». Дополнительные сведения об использовании блоков интерполяционной таблицы см. в разделе Нелинейность.
Чтобы создать записи таблицы замещения кода для функции, соответствующей алгоритму интерполяционной таблицы, вы должны иметь:
Информация о концептуальной сигнатуре функции.
Соответствующие параметры алгоритма.
В этой таблице представлена информация о концептуальной сигнатуре функции.
| Концептуальная сигнатура функции | Сводные данные аргументов |
|---|---|
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 ({ | 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 при помощи инструмента замены кода.
Откройте Code Replacement Tool (crtool) из командной строки MATLAB с помощью следующей команды:
>>crtool
Составьте таблицу.
В контекстном меню crtool выберите File > New Table.
На правой панели назовите таблицу crl_LUT. Нажмите Apply.
Создайте запись. В контекстном меню crtool выберите File > New entry > Function.
Создайте параметры входа. В раскрывающемся списке Function выберите custom. Информация о функции появится в crtool. В данном примере задайте параметр следующим lookup1D . Установите параметры алгоритма, как показано на снимке crtool ниже.
Создайте концептуальное представление. Концептуальное представление описывает сигнатуру функции, которую вы хотите заменить. В 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 как показано на рисунке ниже.
Создайте представление реализации. Представление реализации описывает сигнатуру оптимизационной функции. В данном примере, чтобы указать, что аргументы реализации имеют тот же порядок и свойства, что и концептуальные аргументы, установите флажок Make conceptual and implementation argument types the same.
Добавьте возвращаемый аргумент y1 и аргументы u1, u2, u3 и u4.
Задайте Name для функции замены под Function prototype.
Укажите сведения о сборке. Перейдите на вкладку Build Information, чтобы открыть панель Requirements к сборке. Укажите файлы (источник, заголовок, объект), которые требуется генератору кода для замены кода. В данном примере вам не нужно указывать информацию о сборке.
Проверьте и сохраните таблицу. Щелкните вкладку Mapping Information и проверьте заполнение полей как показано на рисунке. Нажмите Validate entry. В контекстном меню crtool выберите File > Save table > Save.

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

Чтобы использовать библиотеку замены кода, обновите текущий сеанс работы с MATLAB командой:
>>sl_refresh_customizations
Проверьте библиотеку замещения кода. Из командной строки MATLAB откройте библиотеку с помощью Code Replacement Viewer и проверьте, что таблица и запись заданы правильно. Дополнительные сведения см. в разделе Проверка библиотеки замещения кода. Сконфигурируйте модель, чтобы использовать библиотеку замены кода, сгенерировать код и проверить, что замена происходит должным образом. Если происходит непредвиденное поведение, исследуйте журналы попадания и пропуска, чтобы устранить проблемы.
Откройте программный интерфейс из меню MATLAB, выбрав New > Function.
Составьте таблицу.
Создайте функцию с именем таблицы библиотеки замещения кода, которая не имеет аргументов и возвращает объект таблицы. Можно использовать эту функцию для вызова таблицы библиотеки замещения кода.
Создайте объект таблицы путем вызова 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;
Создайте запись. Поскольку этот пример заменяет функцию, создайте запись замены кода в вашей таблице, вызвав функцию 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;
Создайте параметры входа. Поскольку эти примеры заменяют функцию, создайте параметры входа путем вызова функции 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 сохраните этот файл индивидуальной настройки, выбрав File > Save. В командной строке проверьте таблицу библиотеки замещения кода, вызвав ее:
>> 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 откройте библиотеку с помощью Code Replacement Viewer и проверьте, что таблица и запись заданы правильно. Дополнительные сведения см. в разделе Проверка библиотеки замещения кода. Сконфигурируйте модель, чтобы использовать библиотеку замены кода, сгенерировать код и проверить, что замена происходит должным образом. Если происходит непредвиденное поведение, исследуйте журналы попадания и пропуска, чтобы устранить проблемы.
В этом разделе вы генерируете код с помощью библиотеки замены кода, которую вы создали в первых двух разделах этого примера. Функция интерполяционной таблицы заменяется вызовом пользовательской функции в сгенерированном коде. Этот пример не предоставляет функцию реализации. Напишите свою собственную реализацию.
Пример модели
Откройте модель 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;