coder.varsize

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

Описание

пример

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 = 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. Второе измерение каждого элемента имеет переменный размер с верхней границей 3.

Укажите что элементы массива ячеек 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

Больше о

свернуть все

Размерность 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