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

Для генерации кода измерение массива равно 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 вы не можете использовать динамическое выделение памяти для:

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

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

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

Можно управлять, разрешено ли динамическое выделение памяти или когда оно используется для генерации кода. См. Раздел «Управление выделением памяти» для массивов переменного размера в блоке 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-by-:? указывает, что размер первой размерности имеет фиксированный размер 1, а размер второго измерения неограниченный, переменный размер. Курсив указывает, что ваш код указывает, что массив имеет переменный размер, но генератор кода определил, что он не изменяет размер.

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте