Объявите данные переменного размера
coder.varsize(
объявляет что переменные под названием varName1,...,varNameN
)varName1,...,varNameN
имейте переменный размер. Объявление дает генератору кода команду позволять переменным изменять размер во время выполнения сгенерированного кода. С этим синтаксисом вы не задаете верхние границы размерностей переменных или какие размерности могут изменить размер. Генератор кода вычисляет верхние границы. Всем размерностям, кроме одноэлементных размерностей, позволяют изменить размер.
Использование coder.varsize
согласно этим ограничениям и инструкциям:
Использование coder.varsize
в функции MATLAB®, предназначенной для генерации кода.
coder.varsize
объявление должно предшествовать первому использованию переменной. Например:
... x = 1; coder.varsize('x'); disp(size(x)); ...
Использование coder.varsize
объявить, что выходной аргумент имеет переменный размер или исправлять ошибки несоответствия размера. В противном случае, чтобы задать данные переменного размера, используйте методы, описанные в, Задают Данные Переменного Размера для Генерации кода.
Примечание
Для блоков MATLAB Function, чтобы объявить сигналы ввода или вывода переменного размера, используют Порты и Менеджер данных. Смотрите Объявляют Вводы и выводы Переменного Размера. Если вы обеспечиваете верхние границы в a coder.varsize
объявление, верхние границы должны совпадать с верхними границами в Портах и Менеджере данных.
Для большего количества ограничений и инструкций, смотрите Ограничения и Советы.
coder.varsize(
также задает верхнюю границу для каждой размерности переменных. Все переменные должны иметь то же количество размерностей. Всем размерностям, кроме одноэлементных размерностей, позволяют изменить размер.varName1,...,varNameN
,ubounds
)
coder.varsize(
также задает верхнюю границу для каждой размерности переменных и имеет ли каждая размерность фиксированный размер или переменный размер. Если размерность имеет фиксированный размер, то соответствующий varName1,...,varNameN
,ubounds
,dims
)ubound
элемент задает фиксированный размер размерности. Все переменные имеют те же размерности фиксированного размера и те же размерности переменного размера.
coder.varsize
объявление дает генератору кода команду позволять размеру переменной изменяться. Это не изменяет размер переменной. Рассмотрите этот код:
... x = 7; coder.varsize('x', [1,5]); disp(size(x)); ...
После coder.varsize
объявление, x
все еще массив 1 на 1. Вы не можете присвоить значение элементу вне текущего размера x
. Например, этот код производит ошибку времени выполнения, потому что индекс 3 превышает размерности x
.
... x = 7; coder.varsize('x', [1,5]); x(3) = 1; ...
coder.varsize
не поддерживается для входного аргумента функции. Вместо этого:
Если функция является функцией точки входа, укажите, что входной параметр имеет переменный размер при помощи coder.typeof
в командной строке. В качестве альтернативы укажите, что входной аргумент функции точки входа имеет переменный размер при помощи шага Define Input Types приложения.
Если функция не является функцией точки входа, использовать coder.varsize
в функции вызова с переменной, которая является входом к вызванной функции.
Для разреженных матриц, coder.varsize
верхние границы отбрасываний для размерностей переменного размера.
Ограничения для использования coder.varsize
с массивами ячеек:
Массив ячеек может иметь переменный размер, только если это гомогенно. Когда вы используете coder.varsize
с неоднородным массивом ячеек генератор кода пытается сделать массив ячеек гомогенным. Генератор кода пытается найти класс и максимальный размер, которые применяются ко всем элементам массива ячеек. Например, считайте массив ячеек c = {1, [2 3]}
. Оба элемента могут быть представлены двойным типом, первая размерность которого имеет фиксированный размер 1 и чье второе измерение имеет переменный размер с верхней границей 2. Если генератор кода не может найти общий класс и максимальный размер, сбои генерации кода. Например, считайте массив ячеек c = {'a',[2 3]}
. Генератор кода не может найти класс, который может представлять оба элемента, потому что первым элементом является char
и вторым элементом является double
.
Если вы используете cell
функция, чтобы задать массив ячеек фиксированного размера, вы не можете использовать coder.varsize
указывать, что массив ячеек имеет переменный размер. Например, этот код вызывает ошибку генерации кода потому что x = cell(1,3)
делает x
фиксированный размер, 1 3 массив ячеек.
... x = cell(1,3); coder.varsize('x',[1 5]) ...
Можно использовать coder.varsize
с массивом ячеек, который вы задаете при помощи фигурных скобок. Например:
... x = {1 2 3}; coder.varsize('x',[1 5]) ...
Создать массив ячеек переменного размера при помощи cell
функция, используйте этот шаблон кода:
function mycell(n) %#codegen x = cell(1,n); for i = 1:n x{i} = i; end end
См. Определение Массива ячеек Переменного Размера при помощи ячейки.
Чтобы задать верхние границы для массива ячеек, использовать coder.varsize
.
function mycell(n) %#codegen x = cell(1,n); for i = 1:n x{i} = i; coder.varsize('x',[1,20]); end end
coder.varsize
не поддерживается для:
Глобальные переменные
Классы MATLAB или свойства класса
Строковые скаляры
В отчете генерации кода или отчете функции MATLAB, двоеточие (:) указывает, что размерность имеет переменный размер. Например, размер 1x:2
указывает, что первая размерность имеет фиксированный размер одного, и второе измерение имеет переменный размер с верхней границей два.
Если вы используете coder.varsize
чтобы указать, что верхняя граница размерности равняется 1, по умолчанию, размерность имеет фиксированный размер 1. Чтобы указать, что размерность может быть 0 (пустой массив) или 1, установите соответствующий элемент dims
аргумент к true
. Например, этот код указывает что первая размерность x
имеет фиксированный размер 1, и другие размерности имеют переменный размер 5.
coder.varsize('x',[1,5,5])
В отличие от этого этот код указывает что первая размерность x
имеет верхнюю границу 1 и имеет переменный размер (может быть 0 или 1).
coder.varsize('x',[1,5,5],[1,1,1])
Примечание
Для блока MATLAB Function вы не можете указать, что сигнал ввода или вывода с размером 1 имеет переменный размер.
Если вы используете входные переменные или результат расчета с помощью входных переменных, чтобы задать размер массива, это объявляется как переменный размер в сгенерированном коде. Не снова использовать coder.varsize
на массиве, если вы также не хотите задать верхнюю границу для ее размера.
Если вы не задаете верхние границы с a coder.varsize
объявление и генератор кода не могут определить верхние границы, сгенерированный код использует динамическое выделение памяти. Динамическое выделение памяти может уменьшить скорость сгенерированного кода. Чтобы избежать динамического выделения памяти, задайте верхние границы путем обеспечения ubounds
аргумент.