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

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

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

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

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

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

В следующем примере, втором измерении 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. Если вы используете Embedded Coder®, можно настроить сгенерированные идентификаторы для emxArray типы и служебные функции. Смотрите Управление форматом Идентификатора (Embedded Coder).

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

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

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

  2. Снимите флажок Support variable-size arrays.

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

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

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

Похожие темы