Simulink ® Coder™ поддерживает размещение массива основной строки для генерации кода. Можно интегрировать существующие приложения, которые используют размещение массива основной строки с сгенерированным кодом в размещении массива основной строки. Когда вы переключаете существующую модель с блоками интерполяционной таблицы (LUT) из размещения массива основной столбца в размещение массива основной строки, рекомендуется преобразовать блоки LUT из алгоритма основной столбца в алгоритм основной строки. Код, сгенерированный при помощи алгоритма row-major, выполняет с лучшей скоростью и использованием памяти при работе с данными таблицы с размещением массива row-major. Код, сгенерированный при помощи алгоритма column-major, лучше всего работает с размещением массива column-major.
В этом примере показан рабочий процесс преобразования модели с блоками LUT из размещения основного столбца в размещение основной строки для достижения наилучшей эффективности на размещении массива основной строки.
В этом примере вы:
Идентифицируйте размещение массива и выберите оптимизированный алгоритм.
Сохраните семантику через таблицу сочетания.
Сгенерируйте код с помощью алгоритма основной строки и размещения массива.
1. Откройте пример модели rtwdemo_row_lutcol2row_workflow
.
open_system('rtwdemo_row_lutcol2row_workflow');
По умолчанию Simulink конфигурирует модель, чтобы использовать алгоритмы основного столбца и размещение массива основного столбца. Эти параметры являются параметрами конфигурации в диалоговом окне Configuration Parameters.
Математика и типы данных > Использование алгоритмов, оптимизированных для размещения массива с основной строкой - Этот параметр влияет на симуляцию и генерацию кода.
Генерация кода > Интерфейс > размещение массива - Этот параметр влияет только на генерацию кода.
2. На вкладке Modeling нажмите запуск, чтобы симулировать модель и наблюдать выход, зарегистрированный в переменной рабочей области yout.
3. Измените текущую папку в MATLAB ® на папку с возможностью записи. На вкладке Кода С нажатия кнопки Build, чтобы сгенерировать Код С.
Данные таблицы с размещением массива основной строки часто используются в области калибровки. Чтобы сопоставить данные основной таблицы строк с существующей моделью, обновите модель основной таблицы столбцов, чтобы эффективно работать с данными основной таблицы строк.
Используйте алгоритм, который оптимизирован для заданного размещения массива, чтобы достичь наилучшей эффективности. Для примера используйте алгоритмы больших строк, когда Массив размещения задан как Row-major
во время генерации кода.
1. Чтобы включить алгоритмы основной строки, откройте диалоговое окно Параметров конфигурации. На панели Математические и типы данных выберите параметр конфигурации Использовать алгоритмы, оптимизированные для размещения массива с основной строкой. Кроме того, в Командном Окне MATLAB введите:
set_param('rtwdemo_row_lutcol2row_workflow','UseRowMajorAlgorithm','on');
2. Щелкните Выполнить (Run), чтобы симулировать модель. Simulink сообщает об ошибках, поскольку он сталкивается с несогласованными данными точек по оси Х и данных таблицы между блоками предварительной и интерполяции. Причинами этой ошибки являются два семантических изменения, которые происходят, когда вы переключаетесь с алгоритмов основных столбцов на алгоритмы основных строк, то есть, когда вы:
Выберите плоскость из 3-D таблицы в блоке интерполяции.
Выберите плоскость из 4-D таблицы через блок прямой интерполяционной таблицы.
1. Для выбора подтаблицы перед интерполяцией или прямого поиска, который выводит вектор или 2-D матрицу, семантика модели изменяется, когда вы переключаетесь с алгоритма основного столбца на алгоритм основной строки, выбирая параметр конфигурации Использовать алгоритмы, оптимизированные для размещения массива основной строки. Чтобы сохранить семантику и исправить предыдущие ошибки, перестановите данные таблицы с помощью следующих команд:
T4d_str = get_param('rtwdemo_row_lutcol2row_workflow/Direct LUT','Table'); set_param('rtwdemo_row_lutcol2row_workflow/Direct LUT','Table',... ['permute(',T4d_str,',[3,4,1,2])']);
T3d_str = get_param('rtwdemo_row_lutcol2row_workflow/Interp2','Table'); set_param('rtwdemo_row_lutcol2row_workflow/Interp2','Table',... ['permute(',T3d_str,',[3,1,2])']);
2. Прежде чем импортировать данные таблицы из файла, необходимо переместить данные таблицы в файл. Это сочетание сохраняет настраиваемую таблицу на протяжении всего рабочего процесса симуляции и генерации кода.
После перестановки данных таблицы Simulink конфигурирует модель rtwdemo_row_lutcol2row_workflow
для симуляции основной строки. Модель эквивалентна предварительно сконфигурированной модели rtwdemo_row_lutcol2row_workflow_rowrow
который имеет перестановочные данные таблицы и использует алгоритм основной строки.
1. Откройте пример модели rtwdemo_row_lutcol2row_workflow_rowrow
.
open_system('rtwdemo_row_lutcol2row_workflow_rowrow');
2. Чтобы настроить эти модели для генерации кода основной строки, откройте диалоговое окно Параметров конфигурации. В дополнение к включению алгоритмов Use, оптимизированных для параметра конфигурации размещения массива с основной строкой, на панели Генерация Кода > Interface установите параметр конфигурации Array Layout равным Row-Major опция. Параметр Array Layout включает модель для генерации кода основной строки. Кроме того, в Командном Окне MATLAB введите:
% For model 'rtwdemo_row_lutcol2row_workflow_rowrow' set_param('rtwdemo_row_lutcol2row_workflow_rowrow', 'ArrayLayout','Row-major'); % For model 'rtwdemo_row_lutcol2row_workflow' set_param('rtwdemo_row_lutcol2row_workflow', 'ArrayLayout','Row-major');
3. В диалоговые окна блока исследуйте таблицу перестановочных 3-D.
4. Измените текущую папку в MATLAB на папку с возможностью записи. На вкладке Кода С нажатия кнопки Build, чтобы сгенерировать Код С. В сгенерированном коде наблюдайте данные таблицы с размещением массива основной строки
В сгенерированном коде memcpy
функция заменяет for
циклы. Использование memcpy
уменьшает объем памяти для хранения данных. Эта оптимизация улучшает скорость выполнения.
Наблюдайте алгоритмы, оптимизированные для данных основной строки.
close_system('rtwdemo_row_lutcol2row_workflow',0); close_system('rtwdemo_row_lutcol2row_workflow_rowrow',0);