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