coder.varsize

Пакет: кодер

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

Синтаксис

coder.varsize ('var1', 'var2'...)
coder.varsize ('var1', 'var2'..., ubound)
coder.varsize ('var1', 'var2'..., ubound, dims)
coder.varsize ('var1', 'var2'..., [], dims)

Описание

coder.varsize('var1', 'var2', ...) объявляет одну или несколько переменных как данные переменного размера, позволяя последующим присвоениям расширить их размер. Каждый 'varn' является именем переменной или поля структуры, заключенного в кавычки. Если поле структуры принадлежит массиву структур, используйте двоеточие (:) в качестве индексного выражения, чтобы сделать полевой переменный размер для всех элементов массива. Например, выражение, coder.varsize('data(:).A') объявляет, что поле A в каждом элементе data переменное измеренный.

coder.varsize('var1', 'var2', ..., ubound) объявляет одну или несколько переменных как данные переменного размера с явной верхней границей, заданной в ubound. Аргумент ubound должен быть постоянным, вектором с целочисленным знаком размеров верхней границы для каждой размерности каждого 'varn'. Если вы задаете больше чем один 'varn', каждая переменная должна иметь то же количество размерностей.

coder.varsize('var1', 'var2', ..., ubound, dims) объявляет одну или несколько переменных как переменный размер с явной верхней границей и соединением фиксированных и переменных размерностей, заданных в dims. Аргумент dims является логическим вектором или двойным вектором, содержащим только нули и единицы. Размерности, которые соответствуют нулям или false в dims, имеют фиксированный размер; размерности, которые соответствуют единицам или true, отличаются по размеру. Если вы задаете больше чем одну переменную, каждая фиксированная размерность должна иметь то же значение через весь 'varn'.

coder.varsize('var1', 'var2', ..., [], dims) объявляет одну или несколько переменных как переменный размер с соединением фиксированных и переменных размерностей. [] пустого вектора означает, что вы не задаете явную верхнюю границу.

Когда вы не задаете ubound, верхняя граница вычисляется для каждого 'varn' в сгенерированном коде.

Когда вы не задаете dims, размерности приняты, чтобы быть переменными кроме одноэлементных единиц. Одноэлементная размерность является размерностью для который size (A,dim) = 1.

Необходимо добавить объявление coder.varsize, прежде чем каждый 'varn' будет использоваться (чтение). Можно добавить объявление перед первым присвоением на каждый 'varn'. Однако для элемента массива ячеек, объявление coder.varsize должно следовать за первым присвоением на элемент. Например:

...
x = cell(3, 3);
x{1} = [1 2];
coder.varsize('x{1}');
...

Вы не можете использовать coder.varsize вне кода MATLAB®, предназначенного для генерации кода. Например, следующий код не объявляет переменную, var, как данные переменного размера:

coder.varsize('var',10);
codegen -config:lib MyFile -args var

Вместо этого включайте оператор coder.varsize в MyFile, чтобы объявить var как данные переменного размера. Также можно использовать coder.typeof, чтобы объявить var как переменный размер вне MyFile. Это может затем быть передано MyFile во время генерации кода, использующей опцию -args. Для получения дополнительной информации смотрите coder.typeof.

Примеры

свернуть все

Запишите первичной функции test_stack, чтобы дать команды для продвижения данных по и сования данных от стека.

function test_stack %#codegen
    % The directive %#codegen indicates that the function
    % is intended for code generation
    stack('init', 32);
    for i = 1 : 20
        stack('push', i);
    end
    for i = 1 : 10
        value = stack('pop');
        % Display popped value
        value
    end
end

Запишите локальной функции stack, чтобы выполнить поп-команды и нажатие.

function y = stack(command, varargin)
    persistent data;
    if isempty(data)
        data = ones(1,0);
    end
    y = 0;
    switch (command)
    case {'init'}
        coder.varsize('data', [1, varargin{1}], [0 1]);
        data = ones(1,0);
    case {'pop'}
        y = data(1);
        data = data(2:size(data, 2));
    case {'push'}
        data = [varargin{1}, data];
    otherwise
        assert(false, ['Wrong command: ', command]);
    end
end

Переменный data является стеком. Оператор coder.varsize('data', [1, varargin{1}], [0 1]) объявляет что:

  • data является вектором - строкой

  • Его первая размерность имеет фиксированный размер

  • Его второе измерение может вырасти до верхней границы 32

Сгенерируйте MEX-функцию для test_stack:

codegen -config:mex test_stack

codegen генерирует MEX-функцию в текущей папке.

Запустите test_stack_mex, чтобы получить эти результаты:

value =
    20

value =
    19

value =
    18

value =
    17

value =
    16

value =
    15

value =
    14

value =
    13

value =
    12

value =
    11

Во время выполнения количество элементов в стеке растет от нуля до 20, и затем уменьшается к 10.

Запишите функциональный struct_example, который объявляет массив data, где каждый элемент является структурой, которая содержит поле переменного размера:

function y=struct_example() %#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

Оператор coder.varsize('data(:).values') отмечает как переменный размер поле values в каждом элементе матричного data.

Сгенерируйте MEX-функцию для struct_example:

codegen -config:mex struct_example

Запустите struct_example.

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

Запишите функциональный make_varsz_cell, который задает локальную переменную массива ячеек c, элементы которого имеют тот же класс, но различные размеры. Используйте coder.varsize, чтобы указать, что c имеет переменный размер.

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

Сгенерируйте статическую библиотеку C.

codegen -config:lib make_varsz_cell -report

В отчете просмотрите переменные MATLAB.

c 1x:3 гомогенный массив ячеек, элементы которого 1x:2 дважды.

Запишите функциональный mycell, который задает локальную переменную массива ячеек c. Используйте coder.varsize, чтобы сделать элементы переменного размера c.

function y =  mycell()
c = {1 2 3};
coder.varsize('c{:}', [1 5], [0 1]);
y = c;
end

Сгенерируйте статическую библиотеку C.

codegen -config:lib mycell -report

В отчете просмотрите переменные MATLAB.

Элементы c 1:5 массивами, удваивается.

Ограничения

  • При использовании функцию cell, чтобы создать массив cell, вы не можете использовать coder.varsize с тем массивом ячеек.

  • При использовании coder.varsize с элементом массива ячеек, объявление coder.varsize должно следовать за первым присвоением на элемент. Например:

    ...
    x = cell(3, 3);
    x{1} = [1 2];
    coder.varsize('x{1}');
    ...

  • Вы не можете использовать coder.varsize с входным параметром массива ячеек, который неоднороден.

  • Вы не можете использовать coder.varsize с глобальными переменными.

  • Вы не можете использовать coder.varsize со свойствами класса MATLAB.

  • Вы не можете использовать coder.varsize со скалярами строки.

  • Для разреженных матриц coder.varsize пропускает верхние границы для размерностей переменного размера.

Советы

  • Меры coder.varsize размер одноэлементной размерности, если аргумент dims явным образом не указывает, что одноэлементная размерность имеет переменный размер.

    Например, следующий код указывает, что v имеет размер 1:10. Первая размерность (одноэлементная размерность) имеет фиксированный размер. Второе измерение имеет переменный размер.

    coder.varsize('v', [1 10])
    В отличие от этого, следующий код указывает, что v имеет размер:1-by-:10. Обе размерности имеют переменный размер.
    coder.varsize('v',[1,10],[1,1])

    Примечание

    Для блока MATLAB function одноэлементные размерности сигналов ввода или вывода не могут иметь переменного размера.

  • При использовании входные переменные (или результат вычисления с помощью входных переменных), чтобы задать размер массива, это объявляется как переменный размер в сгенерированном коде. Не используйте coder.varsize на массиве снова, если вы также не хотите задать верхнюю границу для ее размера.

  • Используя coder.varsize на массиве без явных верхних границ вызывает динамическое выделение памяти массива. Это динамическое выделение памяти может уменьшить скорость сгенерированного кода. Чтобы избежать динамического выделения памяти, используйте синтаксис coder.varsize('var1', 'var2', ..., ubound), чтобы задать верхнюю границу для размера массивов (если вы знаете это заранее).

  • Массив ячеек может быть переменным размером, только если это гомогенно. Когда вы используете coder.varsize с массивом ячеек, генератор кода пытается сделать массив ячеек гомогенным. Это пытается найти класс и размер, которые применяются ко всем элементам массива ячеек. Например, если первый элемент является двойным, и второй элемент 1x2 дважды, все элементы могут быть представлены как 1x:2 дважды. Если генератор кода не может найти общий класс и размер, сбои генерации кода. Например, предположите, что первый элемент массива ячеек является char, и второй элемент является двойным. Генератор кода не может найти класс, который может представлять оба элемента.

Введенный в R2011a

Была ли эта тема полезной?