Языки программирования и среды принимают размещение единого массива для всех данных. MATLAB® и Фортран используют упорядоченное по столбцам размещение по умолчанию, тогда как C и C++ используют упорядоченное по строкам размещение. С Simulink® Coder™ можно сгенерировать код C/C++, который использует упорядоченное по строкам размещение или упорядоченное по столбцам размещение.
Чтобы узнать больше об упорядоченной по строкам генерации кода, смотрите Генерацию кода Матриц и Массивов.
Блоки MATLAB Function позволяют вам задать пользовательскую функциональность в моделях Simulink при помощи языка MATLAB. Можно сгенерировать упорядоченный по строкам код для моделей, которые содержат блок MATLAB Function при помощи упорядоченных по строкам или упорядоченных по столбцам данных. Для получения дополнительной информации о блоках MATLAB Function смотрите, что функции MATLAB Реализации Используют Блоки (Simulink).
По умолчанию генератор кода генерирует упорядоченный по столбцам код. Для генерации кода C/C++ можно задать размещение массивов на уровне модели при помощи параметра конфигурации модели Array layout (Simulink Coder). Установка этого параметра на Row-major
включает модель для упорядоченной по строкам генерации кода. Чтобы включить блок MATLAB Function в вашей модели для упорядоченной по строкам генерации кода, используйте coder.rowMajor
функция на функциональном уровне в блоке.
Для определенных алгоритмов упорядоченное по строкам размещение обеспечивает более эффективный доступ к памяти. Вы получаете эффективный код, когда вы генерируете код для модели, которая использует упорядоченное по строкам размещение массивов, и модель содержит блок MATLAB Function, который использует алгоритм в упорядоченных по строкам данных.
Рассмотрите модель ex_row_major_MLFB
в качестве примера.
Эта модель содержит блок Constant, который имеет [5 4]
матрица. Чтобы задать матрицу, установите Constant value на:
reshape(1:20,5,4)
[5 4]
матрица. Чтобы задать матрицу, установите Port dimensions на [5 4]
.В диалоговом окне Configuration Parameters, набор Array layout к Row-major
.
Запишите функцию для матричного сложения под названием addMatrix
. Блок MATLAB Function наследовал размещение массивов, сходящее с параметра конфигурации модели Array layout, если не задано в противном случае.
Опционально, можно использовать coder.rowMajor
явным образом установить размещение массивов блока MATLAB Function к упорядоченному по строкам размещению.
function S = addMatrix(A,B) S = zeros(size(A)); for row = 1:size(A,1) for col = 1:size(A,2) S(row,col) = A(row,col) + B(row,col); end end
Сгенерируйте код для модели. От вкладки C Code нажмите Build.
Генератор кода производит этот код С:
for (b_row = 0; b_row < 5; b_row++) { for (b_col = 0; b_col < 4; b_col++) { rtb_S_tmp = (b_row << 2) + b_col; rtb_S[rtb_S_tmp] = ex_row_major_MLFB_P.Constant_Value[rtb_S_tmp] + ex_row_major_MLFB_U.Inport1[rtb_S_tmp]; } }
for
циклы. Первый for
цикл получает доступ к строкам и второму for
цикл получает доступ к столбцам. Когда размещение массивов блока MATLAB Function и модели является тем же самым, сгенерированный код эффективен, потому что не транспонирует, или преобразование требуются.Можно сгенерировать код смешанного большинства, когда у вас есть модель, которая работает с упорядоченными по строкам данными и блоком MATLAB Function, который работает с упорядоченными по столбцам данными. Когда вы генерируете код для модели, которая использует упорядоченное по столбцам размещение, и модель содержит блок MATLAB function, который использует упорядоченное по строкам размещение, затем генератор кода преобразует входные данные блока в упорядоченный по строкам и выходные данные блока назад к упорядоченным по столбцам данным по мере необходимости. Можно также сгенерировать смешанный код большинства, когда у вас есть модель, которая работает с упорядоченными по столбцам данными и блоком MATLAB Function, который работает с упорядоченными по строкам данными.
Преобразования размещения массивов могут влиять на производительность.
Рассмотрите модель ex_row_major_MLFB
в качестве примера. Для получения дополнительной информации о модели в качестве примера смотрите Упорядоченную по строкам Генерацию кода.
В диалоговом окне Configuration Parameters, набор Array layout к Row-major
.
Обновите addMatrix
функция в блоке MATLAB Function для упорядоченных по столбцам данных при помощи coder.columnMajor
функция.
function S = addMatrix(A,B) coder.columnMajor; S = zeros(size(A)); for row = 1:size(A,1) for col = 1:size(A,2) S(row,col) = A(row,col) + B(row,col); end end
Сгенерируйте код для модели. От вкладки C Code нажмите Build.
Генератор кода производит этот код С:
for (b_row = 0; b_row < 4; b_row++) { for (b_col = 0; b_col < 5; b_col++) { B_tmp = (b_col << 2) + b_row; B_tmp_0 = b_col + 5 * b_row; B[B_tmp_0] = ex_row_major_MLFB_19b_U.Inport1[B_tmp]; A[B_tmp_0] = ex_row_major_MLFB_19b_P.Constant_Value[B_tmp]; } } for (b_row = 0; b_row < 5; b_row++) { /* Outport: '<Root>/Outport' */ for (b_col = 0; b_col < 4; b_col++) { B_tmp = 5 * b_col + b_row; ex_row_major_MLFB_19b_Y.Outport[b_col + (b_row << 2)] = A[B_tmp] + B[B_tmp]; }