В этом примере показано, как использовать динамическое выделение памяти для массивов переменного размера в блоке функции MATLAB. Динамическое выделение памяти распределяет память в куче по мере необходимости во время выполнения, а не статически распределяет память в стеке. Динамическое выделение памяти полезно в следующих случаях:
Вы не знаете верхнюю границу массива.
Выделение памяти в стеке для больших массивов не требуется.
Динамическое выделение памяти можно использовать только для массивов, локальных для функционального блока MATLAB.
Динамическое выделение памяти для:
Входные и выходные сигналы. Входные и выходные сигналы переменного размера должны иметь верхнюю границу.
Параметры или глобальные переменные. Параметры и глобальные переменные должны быть фиксированного размера.
Поля массивов шин. Массивы шин не могут иметь поля переменного размера.
Свойства дискретного состояния объектов System, связанных с блоком MATLAB System.
Создайте модель Simulink с блоком MATLAB Function с неограниченным массивом переменного размера.

Создание модели Simulink ®mymodel.
Добавьте в модель функциональный блок MATLAB.
В блоке MATLAB Function добавьте следующий код:
function s = myfcn(n) Z = rand(1,n); s = sum(Z); end
Добавьте блок константы слева от блока функции MATLAB.
Добавьте блок Outport справа от блока MATLAB Function.
Подключите блоки.
Убедитесь, что модель настроена на использование динамического выделения памяти для массивов переменного размера в функциональных блоках MATLAB. В диалоговом окне «Параметры конфигурации» в категории «Цель моделирования» > «Дополнительные параметры» убедитесь, что:
Установлен флажок Динамическое выделение памяти в функциях MATLAB.
Пороговое значение динамического выделения памяти в параметре функций MATLAB имеет значение по умолчанию 65536.
Моделирование модели.
В редакторе функций MATLAB для открытия отчета о функциях MATLAB ® щелкните Просмотр отчета.
Вкладка «Переменные» показывает, что Z является 1-побочным:? массив. Двоеточие (:) указывает, что второе измерение имеет переменный размер. Знак вопроса (?) указывает, что второе измерение является неограниченным.
Моделирование должно использовать динамическое выделение памяти для Z потому что второе измерение Z не имеет верхней границы.
Если массив не ограничен, генератор кода должен использовать динамическое выделение памяти. Если массив ограничен, генератор кода использует динамическое выделение памяти, только если размер массива в байтах больше или равен порогу динамического выделения памяти. Значение по умолчанию для этого порога - 65536.
Динамическая память имеет затраты на производительность во время выполнения. Контролируя его использование, можно повысить скорость выполнения.
Если вы делаете Z ограниченный массив переменного размера с размером, превышающим пороговое значение, генератор кода использует динамическое выделение памяти для Z. Например:
В mymodel, изменить myfcn чтобы Z имеет верхнюю границу 500.
function s = myfcn(n) assert(n < 500); Z = rand(1,n); s = sum(Z); end
Моделирование модели.
В отчете о функциях MATLAB видно, что Z является массивом 1-by-: 500. Он переменного размера с верхней границей 500.
Понизить динамическое выделение памяти до значения, меньшего или равного 4000, который является размером, в байтах, Z. В диалоговом окне Configuration Parameters в категории Simulation Target > Advanced parameters установите для параметра Dynamic memory allocation threshold in MATLAB functions значение 4000.
Моделирование модели.
Генератор кода использует динамическое выделение памяти, поскольку размер Z равно порогу динамического выделения памяти, 4000.
При наличии Coder™ Simulink можно создать код C для этой модели. Затем можно увидеть, как генератор кода представляет динамически распределенные массивы.
Настройте модель для использования решателя с фиксированным шагом. В диалоговом окне Параметры конфигурации (Configuration Parameters) на панели Решатель (Solver) в разделе Выбор решателя (Solver selection) выполните следующие действия.
Для параметра «Тип» выберите Fixed-step.
Для параметра «Решатель» выберите discrete (no continuous states).
Настройте модель для создания и использования отчета о создании кода. В диалоговом окне Параметры конфигурации на панели Создание кода > Отчет выберите Создать отчет о создании кода и Открыть отчет автоматически.
Отредактируйте код в блоке MATLAB Function таким образом, чтобы он выглядел следующим образом:
function s = myfcn(n) Z = rand(1,n); s = sum(Z); end
Z является неограниченным массивом переменного размера.
Убедитесь, что модель настроена на динамическое выделение памяти:
Установлен флажок Динамическое выделение памяти в функциях MATLAB.
Пороговое значение динамического выделения памяти в параметре функций MATLAB имеет значение по умолчанию 65536.
Создайте модель.
В отчете о создании кода откройте mymodel.c. Можно сказать, что генератор кода использовал динамическое выделение памяти для Z потому что вы видите emxArray напечатать emxArray_real_T_mymodel_T и emxArray служебные функции, такие как mymodel_emxInit_real_T. Генератор кода использует emxArray тип для переменных, память которых выделяется динамически. Созданный код использует emxArray служебные функции для управления emxArrays.
Если у вас есть Embedded Coder ®, вы можете настроить идентификаторы дляemxArray типы и функции утилиты. См. раздел Управление форматом идентификатора (встроенный кодер).