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 объявить, что выходной аргумент имеет размер переменной или адресовать ошибки несоответствия размера. В противном случае для определения данных переменного размера используйте методы, описанные в Define Variable-Size Data для генерации кода.

Примечание

Для MATLAB Function блоков, чтобы объявить входные или выходные сигналы переменного размера, используйте Ports и Data Manager. См. «Объявление входов и выходов переменного размера». Если вы задаете верхние границы в coder.varsize объявление, верхние границы должны совпадать с верхними границами в Ports и Data Manager.

Дополнительные ограничения и рекомендации см. в разделе Ограничения и советы.

пример

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

пример

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

Примеры

свернуть все

После использования переменной (read) изменение размера переменной может вызвать ошибку несоответствия размера. Использовать 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, использовать этот шаблон кода:

      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 или свойства класса

    • Строковые скаляры

Подробнее о

свернуть все

Синглтонная размерность

Размерность, для которой 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