Сгенерируйте упорядоченный по строкам код для модели, которая содержит блок MATLAB function

Языки программирования и среды принимают размещение единого массива для всех данных. MATLAB® и Фортран используют упорядоченное по столбцам размещение по умолчанию, тогда как C и C++ используют упорядоченное по строкам размещение. С Simulink® Coder™ можно сгенерировать код C/C++, который использует упорядоченное по строкам размещение или упорядоченное по столбцам размещение.

Чтобы узнать больше об упорядоченной по строкам генерации кода, смотрите Генерацию кода Матриц и Массивов.

Блоки MATLAB Function позволяют вам задать пользовательскую функциональность в моделях Simulink при помощи языка MATLAB. Можно сгенерировать упорядоченный по строкам код для моделей, которые содержат блок MATLAB Function при помощи упорядоченных по строкам или упорядоченных по столбцам данных. Для получения дополнительной информации о блоках MATLAB Function смотрите, что функции MATLAB Реализации Используют Блоки.

По умолчанию генератор кода генерирует упорядоченный по столбцам код. Для генерации кода C/C++ можно задать размещение массивов на уровне модели при помощи параметра конфигурации модели Array layout. Установка этого параметра на Row-major включает модель для упорядоченной по строкам генерации кода. Чтобы включить блок MATLAB Function в вашей модели для упорядоченной по строкам генерации кода, используйте coder.rowMajor функция на функциональном уровне в блоке.

Упорядоченная по строкам генерация кода

Для определенных алгоритмов упорядоченное по строкам размещение обеспечивает более эффективный доступ к памяти. Вы получаете эффективный код, когда вы генерируете код для модели, которая использует упорядоченное по строкам размещение массивов, и модель содержит блок MATLAB Function, который использует алгоритм для упорядоченных по строкам данных.

  1. Рассмотрите модель ex_row_major_MLFB в качестве примера.

    Эта модель содержит блок Constant, который имеет [5 4] матрица. Чтобы задать матрицу, установите Constant value на:

    reshape(1:20,5,4)
    Блок Inport также задает [5 4] матрица. Чтобы задать матрицу, установите Port dimensions на [5 4].

  2. В диалоговом окне Configuration Parameters, набор Array layout к Row-major.

  3. Запишите функцию для матричного сложения под названием 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

  4. Сгенерируйте код для модели. От вкладки 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, который работает с упорядоченными по строкам данными.

Преобразования размещения массивов могут влиять на эффективность.

  1. Рассмотрите модель ex_row_major_MLFB в качестве примера. Для получения дополнительной информации о модели в качестве примера смотрите Упорядоченную по строкам Генерацию кода.

    В диалоговом окне Configuration Parameters, набор Array layout к Row-major.

  2. Обновите 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
    Можно сгенерировать код смешанного большинства при помощи блока MATLAB Function. В этом случае вы конфигурируете модель для упорядоченного по строкам размещения массивов и блок MATLAB Function для упорядоченного по столбцам размещения массивов.

  3. Сгенерируйте код для модели. От вкладки 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];
    }
Входные параметры с блоком MATLAB Function существуют в упорядоченной по строкам среде. Генератор кода выполняет операцию преобразования на входных параметрах, прежде чем они будут питаться блок MATLAB Function, потому что блок является упорядоченным по столбцам размещением. После обработки алгоритма в блоке MATLAB Function генератор кода преобразует данные назад в упорядоченные по строкам данные прежде, чем передать данные Outport.

Похожие темы