Сгенерируйте код основной строки для модели, которая содержит блок 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. В диалоговом окне Параметров конфигурации установите 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. Для получения дополнительной информации о модели примера смотрите Row-Major Генерация Кода.

    В диалоговом окне Параметров конфигурации установите 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.

Похожие темы