exponenta event banner

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

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

пример

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 в командной строке. Либо укажите, что входной аргумент функции точки входа имеет переменный размер, используя шаг Определить типы ввода приложения.

    • Если функция не является функцией точки входа, используйте 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