Генерация кода для массивов Переменного Размера

Для генерации кода измерение массива является фиксированным размером или переменным размером. Если генератор кода может определить размер размерности и что размер размерности не изменяется, то размерность является фиксированным размером. Когда все размерности массива являются фиксированным размером, массив является массивом фиксированного размера. В следующем примере Z является массивом фиксированного размера.

function Z = myfcn()
Z = zeros(1,4);
end

Размер первой размерности равняется 1, и размер второго измерения равняется 4.

Если генератор кода не может определить размер размерности, или генератор кода решает, что размер изменяется, то размерность является переменным размером. Когда по крайней мере одна из его размерностей является переменным размером, массив является массивом переменного размера.

Размерность переменного размера или ограничена или неограниченна. Ограниченная размерность имеет фиксированный верхний размер. Неограниченная размерность не имеет фиксированного верхнего размера.

В следующем примере второе измерение Z ограничено, переменный размер. Это имеет верхнюю границу 16.

function s = myfcn(n)
if (n > 0)
    Z = zeros(1,4);
else
    Z = zeros(1,16);
end
s = length(Z);

В следующем примере, если значение n неизвестно во время компиляции, то второе измерение Z неограниченно.

function s = myfcn(n)
Z = rand(1,n);
s = sum(Z);
end

Можно задать массивы переменного размера:

  • Используя конструкторов, таких как zeros, с непостоянной размерностью

  • Присвоение нескольких, постоянных размеров к той же переменной перед использованием его

  • Объявление, что все экземпляры переменной переменный размер при помощи coder.varsize

Для получения дополнительной информации смотрите, Задают Данные Переменного Размера для Генерации кода.

Можно управлять, позволены ли массивы переменного размера для генерации кода. Смотрите Включение и Отключение Поддержки Массивов Переменного Размера.

Выделение памяти для массивов Переменного Размера

Для массивов фиксированного размера и массивов переменного размера, размер которых является меньше, чем порог, генератор кода выделяет память статически на стеке. Для неограниченного, массивов переменного размера и массивов переменного размера, размер которых больше, чем или равен порогу, генератор кода выделяет память динамически на куче.

Для блока MATLAB function вы не можете использовать динамическое выделение памяти для:

  • Сигналы ввода и вывода. Сигналы ввода и вывода переменного размера должны иметь верхнюю границу.

  • Параметры или глобальные переменные. Параметры и глобальные переменные должны быть фиксированным размером.

  • Поля массивов шины A. Массивы шины A не могут иметь полей переменного размера.

Можно управлять, позволено ли динамическое выделение памяти или когда оно используется для генерации кода. Смотрите Выделение Управляющей памяти для Массивов Переменного Размера в блоке MATLAB function.

Генератор кода представляет динамически выделенные данные как тип структуры под названием emxArray. Генератор кода генерирует служебные функции, которые создают и взаимодействуют с emxArrays. При использовании Встроенный Coder®, можно настроить сгенерированные идентификаторы для типов emxArray и служебных функций. Смотрите Управление форматом Идентификатора (Embedded Coder).

Включение и отключение поддержки массивов Переменного Размера

По умолчанию, для блоков MATLAB function, поддержка массивов переменного размера включена. Отключить эту поддержку:

  1. В Редакторе блока MATLAB function выберите Edit Data.

  2. Снимите флажок переменного размера Поддержки массивов.

Массивы переменного размера в отчете функции MATLAB

Можно сказать, является ли массив фиксированным размером или переменным размером путем рассмотрения столбца Размера вкладки Variables в Отчете функции MATLAB.

Двоеточие (:) указывает, что размерность является переменным размером. Вопросительный знак (?) указывает, что размер неограничен. Например, размер 1 на:? указывает, что размер первой размерности является фиксированным размером 1, и размер второго измерения неограничен, переменный размер. Курсив указывает, что ваш код указывает, что массив является переменным размером, но генератор кода решил, что это не изменяет размер.

Похожие темы

Была ли эта тема полезной?