Объявите данные переменного размера
coder.varsize(varName1,...,varNameN)
coder.varsize(varName1,...,varNameN,ubounds)
coder.varsize(varName1,...,varNameN,ubounds,dims)
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, чтобы объявить сигналы ввода или вывода переменного размера, используют Порты и Менеджер данных. Смотрите Объявляют Вводы и выводы Переменного Размера. Если вы обеспечиваете верхние границы в объявлении 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
В отчете генерации кода или отчете функции 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
на массиве, если вы также не хотите задать верхнюю границу для ее размера.
Если вы не задаете верхние границы с объявлением coder.varsize
, и генератор кода не может определить верхние границы, сгенерированный код использует динамическое выделение памяти. Динамическое выделение памяти может уменьшить скорость сгенерированного кода. Чтобы избежать динамического выделения памяти, задайте верхние границы путем обеспечения аргумента ubounds
.