Объявить данные переменного размера
coder.varsize(
объявляет, что переменные с именем varName1,...,varNameN
)varName1,...,varNameN
иметь размер переменной. Объявление предписывает генератору кода разрешить переменным изменять размер во время выполнения сгенерированного кода. С помощью этого синтаксиса вы не задаете верхние границы размерностей переменных или какие размерности могут изменить размер. Генератор кода вычисляет верхние границы. Всем размерностям, кроме синглтонных, разрешается изменять размер.
Использовать coder.varsize
в соответствии с этими ограничениями и руководящими принципами:
Использовать coder.varsize
внутри MATLAB® функция, предназначенная для генерации кода.
coder.varsize
объявление должно предшествовать первому использованию переменной. Для примера:
... x = 1; coder.varsize('x'); disp(size(x)); ...
Использовать coder.varsize
объявить, что выходной аргумент имеет размер переменной или адресовать ошибки несоответствия размера. В противном случае для определения данных переменного размера используйте методы, описанные в Define Variable-Size Data для генерации кода.
Примечание
Для MATLAB Function блоков, чтобы объявить входные или выходные сигналы переменного размера, используйте Ports и Data Manager. См. «Объявление входов и выходов переменного размера» (Simulink). Если вы задаете верхние границы в coder.varsize
объявление, верхние границы должны совпадать с верхними границами в Ports и Data Manager.
Дополнительные ограничения и рекомендации см. в разделе Ограничения и советы.
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, использовать этот шаблон кода:
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
в массиве, если вы также не хотите задать верхнюю границу для его размера.
Если вы не задаете верхние границы с coder.varsize
объявление и генератор кода не может определить верхние границы, сгенерированный код использует динамическое выделение памяти. Динамическое выделение памяти может снизить скорость сгенерированного кода. Чтобы избежать динамического выделения памяти, задайте верхние границы путем предоставления ubounds
аргумент.