Можно сконфигурировать алгоритм для операций поиска по таблице и поиска по индексу и сгенерировать код. Если код, сгенерированный для доступных опций алгоритма, не соответствует требованиям к вашему приложению, создайте пользовательские записи таблицы замещения кода, чтобы заменить сгенерированный код алгоритма. Можно разработать библиотеку замещения кода, чтобы оптимизировать эффективность алгоритмов в блоке интерполяционной таблицы. Для получения дополнительной информации см. раздел «Разработка библиотеки замещения кода». Дополнительные сведения об использовании блоков интерполяционной таблицы см. в разделе Нелинейность.
Чтобы создать записи таблицы замещения кода для функции, соответствующей алгоритму интерполяционной таблицы, вы должны иметь:
Информация о концептуальной сигнатуре функции.
Соответствующие параметры алгоритма.
В этой таблице представлена информация о концептуальной сигнатуре функции.
Концептуальная сигнатура функции | Сводные данные аргументов |
---|---|
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;