coder.varsize

Объявите данные переменного размера

Синтаксис

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

Для большего количества ограничений и инструкций, смотрите Ограничения и Советы.

пример

coder.varsize(varName1,...,varNameN,ubounds) также задает верхнюю границу для каждой размерности переменных. Все переменные должны иметь то же количество размерностей. Всем размерностям, кроме одноэлементных размерностей, позволяют изменить размер.

пример

coder.varsize(varName1,...,varNameN,ubounds,dims) также задает верхнюю границу для каждой размерности переменных и имеет ли каждая размерность фиксированный размер или переменный размер. Если размерность имеет фиксированный размер, то соответствующий элемент ubound задает фиксированный размер размерности. Все переменные имеют те же размерности фиксированного размера и те же размерности переменного размера.

Примеры

свернуть все

После того, как переменная используется (чтение), изменение размера переменной может вызвать ошибку несоответствия размера. Используйте coder.varsize, чтобы указать, что размер переменной может измениться.

Генерация кода для следующей функции производит ошибку несоответствия размера, потому что x = 1:10 изменяет размер второго измерения x после строки y = size(x), который использует x.

function [x,y] = usevarsize(n)
%#codegen
x = 1;
y = size(x);
if n > 10
    x = 1:10;
end

Чтобы объявить, что x может изменить размер, используйте coder.varsize.

function [x,y] = usevarsize(n)
%#codegen
x = 1;
coder.varsize('x');
y = size(x);
if n > 10
    x = 1:10;
end

Если вы удаляете строку y = size(x), вам больше не нужно объявление coder.varsize, потому что x не используется, прежде чем его размер изменяется.

Укажите, что A является вектором - строкой, второе измерение которого имеет переменный размер с верхней границей 20.

function fcn()
...
coder.varsize('A',[1 20]);
...
end

Когда вы не обеспечиваете dims, все размерности, кроме одноэлементных размерностей, имеют переменный размер.

Укажите, что A является массивом, первая размерность которого имеет фиксированный размер три и чье второе измерение имеет переменный размер с верхней границей 20.

function fcn()
...
coder.varsize('A',[3 20], [0 1] );
...
end

Если поле структуры принадлежит массиву структур, используйте двоеточие (:) в качестве индексного выражения, чтобы сделать полевой переменный размер для всех элементов массива.

В этой функции оператор coder.varsize('data(:).values') объявляет, что поле values в каждом элементе data имеет переменный размер.

function y = varsize_field()
%#codegen

d = struct('values', zeros(1,0), 'color', 0);
data = repmat(d, [3 3]);
coder.varsize('data(:).values');

for i = 1:numel(data)
    data(i).color = rand-0.5;
    data(i).values = 1:i;
end

y = 0;
for i = 1:numel(data)
    if data(i).color > 0
        y = y + sum(data(i).values);
    end
end

Укажите, что массив ячеек C имеет фиксированный размер первое второе измерение размерности и переменного размера с верхней границей три. Объявление coder.varsize должно предшествовать первому использованию C.

...
C = {1 [1 2]};
coder.varsize('C', [1 3], [0 1]);
y = C{1};
...
end

Без объявления coder.varsize C является неоднородным массивом ячеек, элементы которого имеют тот же класс и различные размеры. С объявлением coder.varsize C является гомогенным массивом ячеек, элементы которого имеют тот же класс и максимальный размер. Первая размерность каждого элемента фиксируется в 1. Второе измерение каждого элемента имеет переменный размер с верхней границей 2.

Укажите, что элементы массива ячеек C являются векторами с фиксированным размером первое второе измерение размерности и переменного размера с верхней границей 5.

...
C = {1 2 3};
coder.varsize('C{:}', [1 5], [0 1]);
C = {1, 1:5, 2:3};
...

Входные параметры

свернуть все

Имена переменных, чтобы объявить как наличие переменного размера, заданного как один или несколько векторов символов или скаляров строки.

Пример: coder.varsize('x','y')

Верхние границы для измерений массива, заданных как вектор целочисленных констант.

Когда вы не задаете ubounds, генератор кода вычисляет верхнюю границу для каждой переменной. Если элемент ubounds соответствует размерности фиксированного размера, значение является фиксированным размером размерности.

Пример: coder.varsize('x','y',[1 2])

Индикация относительно того, имеет ли каждая размерность фиксированный размер или переменный размер, заданный как логический вектор. Размерности, которые соответствуют 0 или false в dims, имеют фиксированный размер. Размерности, которые соответствуют 1 или true, имеют переменный размер.

Когда вы не задаете dims, размерности имеют переменный размер, за исключением одноэлементных размерностей.

Пример: coder.varsize('x','y',[1 2], [0 1])

Ограничения

  • Объявление 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 или свойства класса

    • Представьте скаляры в виде строки

Больше о

свернуть все

Размерность Singleton

Размерность, для который size(A,dim) = 1.

Советы

  • В отчете генерации кода или отчете функции 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.

Введенный в R2011a