Specify Properties входных параметров функции точки входа

Почему необходимо задать входные свойства

Поскольку C и C++ являются статически типизированными языками, MATLAB® Coder™ должен определить свойства всех переменных в файлах MATLAB во время компиляции. Чтобы вывести переменные свойства в файлах MATLAB, MATLAB CODER должен смочь идентифицировать свойства входных параметров к первичной функции, также известной как функцию или точки входа верхнего уровня. Поэтому, если ваша первичная функция имеет входные параметры, необходимо задать свойства этих входных параметров к MATLAB CODER. Если ваша первичная функция не имеет никаких входных параметров, MATLAB CODER может скомпилировать ваш файл MATLAB без модификации. Вы не должны задавать свойства входных параметров к локальным функциям или внешним функциям, вызванным первичной функцией.

При использовании тильду (~) символ, чтобы задать неиспользованные входные параметры функции:

  • В проектах MATLAB CODER, если вы хотите, чтобы другой тип появился в сгенерированном коде, задают тип. В противном случае входное значение по умолчанию к действительному, скалярному удваивается.

  • При генерации кода с codegen необходимо задать тип этих входных параметров с помощью опции -args.

Свойства задать

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

ДляЗадайте свойства
 КлассРазмерСложностьnumerictypefimath
Входные параметры фиксированной точки

Каждое поле в структуре вводится

 Задайте свойства для каждого поля согласно его классу

Другие входные параметры

  

Значения свойств по умолчанию

MATLAB CODER присваивает следующие значения по умолчанию для свойств входных параметров первичной функции.

СвойствоЗначение по умолчанию
класс'double'
размерscalar
сложностьдействительный
numerictypeНикакое значение по умолчанию
fimathОбъект fimath значения по умолчанию MATLAB

Определение Значений по умолчанию для Полей Структуры.  В большинстве случаев, когда вы явным образом не задаете значения для свойств, MATLAB CODER использует значения по умолчанию за исключением полей структуры. Единственный способ назвать поле в структуре состоит в том, чтобы установить по крайней мере одно из своих свойств. Поэтому вы можете должны быть задать значения по умолчанию для свойств полей структуры. Для примеров смотрите Класс Определения и Размер Скалярной Структуры и Определения Класса и Размера Массива структур.

Определение Значения по умолчанию fimath Значения для MEX-функций.  MEX-функции, сгенерированные с MATLAB CODER, используют значение fimath по умолчанию в действительности во время компиляции. Если вы не задаете значение fimath по умолчанию, MATLAB CODER использует значение по умолчанию MATLAB fimath. Заводская настройка MATLAB имеет следующие свойства:

RoundingMethod: Nearest
OverflowAction: Saturate
ProductMode: FullPrecision
SumMode: FullPrecision
CastBeforeSum: true
Для получения дополнительной информации см. fimath для Совместного использования Арифметических Правил (Fixed-Point Designer).

При выполнении MEX-функций, которые зависят от значения fimath по умолчанию, не изменяйте это значение во время сеанса работы с MATLAB. В противном случае вы получаете предупреждение времени выполнения, предупреждая вас к несоответствию между временем компиляции и значениями fimath во время выполнения.

Например, предположите, что вы задаете следующую функцию MATLAB test:

function y = test %#codegen
y = fi(0);

Функциональный test создает объект fi, явным образом не задавая объект fimath. Поэтому test полагается на объект fimath по умолчанию в действительности во время компиляции. В посдказке MATLAB сгенерируйте MEX-функцию text_mex, чтобы использовать заводскую настройку значения по умолчанию MATLAB fimath:

codegen test
% codegen generates a MEX function, test_mex, 
% in the current folder

Затем, запустите test_mex, чтобы отобразить значение по умолчанию MATLAB значение fimath:

test_mex
 
ans =
 
     0

          DataTypeMode: Fixed-point: binary point scaling
            Signedness: Signed
            WordLength: 16
        FractionLength: 15

Теперь создайте локальный MATLAB значение fimath. таким образом, вы больше не используете настройку по умолчанию:

F = fimath('RoundingMethod','Floor');

Наконец, очистите MEX-функцию из памяти и повторно выполните его:

clear test_mex
test_mex

Несоответствие обнаруживается и вызывает ошибку:

??? This function was generated with a different default
fimath than the current default.

Error in ==> test_mex

Поддерживаемые классы

Следующая таблица представляет имена классов, поддержанные MATLAB CODER.

ClassName Описание
логическийЛогический массив истинных и ложных значений
'char'Массив символов
int88-битный массив целого числа со знаком
uint88-битный массив беззнаковых целых чисел
int1616-битный массив целого числа со знаком
uint1616-битный массив беззнаковых целых чисел
int3232-битный массив целого числа со знаком
uint3232-битный массив беззнаковых целых чисел
int6464-битный массив целого числа со знаком
uint6464-битный массив беззнаковых целых чисел
единственныйМассив номера или фиксированной точки с плавающей точкой с одинарной точностью
'double'С двойной точностью массив номера или фиксированной точки с плавающей точкой
struct ()Массив структур
embedded.fiМассив номера фиксированной точки

Правила для Specifying Properties первичных вводов

При определении свойств первичных входных параметров следуйте этим правилам:

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

  • Чтобы сгенерировать меньше аргументов, чем те аргументы, которые происходят в функции MATLAB, задайте свойства для только количества аргументов, которые вы хотите в сгенерированной функции.

  • Если функция MATLAB имеет входные параметры, чтобы сгенерировать функцию, которая не имеет никаких входных параметров, передайте массив пустой ячейки -args.

  • Для каждого входного параметра первичной функции, класс которого является фиксированной точкой (fi), задайте входные свойства numerictype и fimath.

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

Методы для Defining Properties первичных вводов

МетодПреимуществаНедостатки

Specify Properties входных параметров функции точки входа Используя приложение

  • Если вы работаете в проекте MATLAB CODER, простом в использовании

  • Не изменяет оригинальный код MATLAB

  • MATLAB CODER сохраняет определения в файле проекта

  • Не эффективный для определения интенсивно использующих память входных параметров, таких как большие структуры и массивы

Задайте входные свойства на примере в командной строке

Примечание

Если вы задаете входные свойства программно в файле MATLAB, вы не можете использовать этот метод

  • Простой в использовании

  • Не изменяет оригинальный код MATLAB

  • Разработанный для анализа прототипа функции, которая имеет несколько первичных входных параметров

  • Должен быть задан в командной строке каждый раз, когда вы вызываете codegen (если вы не используете скрипт),

  • Не эффективный для определения интенсивно использующих память входных параметров, таких как большие структуры и массивы

Задайте входные свойства программно в файле MATLAB

  • Интегрированный с кодом MATLAB; никакая потребность переопределить свойства каждый раз вы вызываете MATLAB Coder

  • Предоставляет документацию спецификаций свойства в коде MATLAB

  • Эффективный для определения интенсивно использующих память входных параметров, таких как большие структуры

  • Использование объединяет синтаксис

  • Файлы проекта MATLAB CODER в настоящее время не распознают свойства, заданные программно. При использовании проект, необходимо повторно войти во входные типы в проекте.

Задайте входные свойства на примере в командной строке

Параметр командной строки-args

Функция codegen обеспечивает параметр командной строки -args для определения свойств первичных (точка входа) входные параметры функции как массив ячеек значений в качестве примера или типов. Массив ячеек может быть переменным или литеральным массивом постоянных значений. Используя эту опцию, вы задаете свойства входных параметров в то же время, что и вы генерируете код для функции MATLAB с codegen.

Можно передать выходной тип от одной функции точки входа как входной параметр другому. Смотрите Передачу Функция Точки входа Вывод как Входной параметр. Для получения информации об определении входных параметров массива ячеек смотрите, Задают Вводы Массива ячеек в Командной строке.

Если у вас есть тестовая функция или скрипт, который вызывает функцию MATLAB точки входа с необходимыми типами, можно использовать coder.getArgTypes, чтобы определить типы входных параметров функции. coder.getArgTypes возвращает массив ячеек объектов coder.Type, которые можно передать codegen с помощью опции -args. Смотрите Specifying General Properties Первичных Вводов для codegen.

Правила для Использования-args опции

При использовании параметра командной строки -args, чтобы задать свойства на примере, следуйте этим правилам:

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

  • Чтобы сгенерировать меньше аргументов, чем те аргументы, которые происходят в функции MATLAB, задайте свойства для только количества аргументов, которые вы хотите в сгенерированной функции.

  • Если функция MATLAB имеет входные параметры, чтобы сгенерировать функцию, которая не имеет никаких входных параметров, передайте массив пустой ячейки -args.

  • Для каждого входного параметра первичной функции, класс которого является фиксированной точкой (fi), задайте входные свойства numerictype и fimath.

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

Specifying Properties первичных вводов на примере в командной строке

Рассмотрите функцию MATLAB, которая добавляет ее два входных параметра:

function y = mcf(u,v)
%#codegen
y = u + v;

Следующие примеры показывают, как задать различные свойства первичных входных параметров u и v на примере в командной строке:

  • Используйте литеральный массив ячеек констант, чтобы указать, что оба входных параметра являются действительным скаляром, удваивается:

    codegen mcf -args {0,0}

  • Используйте литеральный массив ячеек констант, чтобы указать, что u входного параметра является 16-битным, вектором 1 на 4 без знака и ввел v, скаляр дважды:

    codegen  mcf -args {zeros(1,4,'uint16'),0}

  • Присвойте демонстрационные значения переменной массива ячеек, чтобы указать, что оба входных параметра являются действительными, 8-битными целочисленными векторами без знака:

    a = uint8([1;2;3;4])
    b = uint8([5;6;7;8])
    ex = {a,b}
    codegen mcf -args ex

Specifying Properties первичных вводов фиксированной точки на примере в командной строке

Чтобы сгенерировать MEX-функцию или код C/C++ для фиксированной точки код MATLAB, необходимо установить программное обеспечение Fixed-Point Designer™.

Рассмотрите функцию MATLAB, которая вычисляет квадратный корень из номера фиксированной точки:

%#codegen
function y = sqrtfi(x)
y = sqrt(x);

Чтобы задать свойства первичной фиксированной точки вводит x на примере, выполняют эти шаги:

  1. Задайте свойства numerictype для x, например:

    T = numerictype('WordLength',32,...
                    'FractionLength',23,...
                    'Signed',true);

  2. Задайте свойства fimath для x, например:

    F = fimath('SumMode','SpecifyPrecision',...
               'SumWordLength',32,...
               'SumFractionLength',23,...
               'ProductMode','SpecifyPrecision',...
               'ProductWordLength',32,...
               'ProductFractionLength',23);
  3. Создайте переменную фиксированной точки со свойствами numerictype и fimath, которые вы задали, например:

    myeg = { fi(4.0,T,F) };

  4. Скомпилируйте функциональный sqrtfi с помощью команды codegen, передав переменный myeg в качестве аргумента к опции -args, например:

    codegen sqrtfi -args myeg;

Задайте постоянные вводы в командной строке

Если вы знаете, что ваши первичные входные параметры не изменяются во время выполнения, можно уменьшить наверху в сгенерированном коде путем указывания, что первичные входные параметры являются постоянными значениями. Постоянные входные параметры обычно используются для флагов, которые управляют, как алгоритм выполняется и значения, которые задают размеры или типы данных.

Чтобы указать, что входные параметры являются константами, используйте параметр командной строки -args с объектом coder.Constant. Чтобы указать, что входной параметр является константой с размером, классом, сложность и значение constant_input, используют следующий синтаксис:

-args {coder.Constant(constant_input)}

Вызов функций с постоянными вводами

Генератор кода компилирует входные параметры постоянной функции в сгенерированный код. В сгенерированном C или Коде С++, функциональные подписи не содержат постоянные входные параметры. По умолчанию подписи MEX-функции содержат постоянные входные параметры. Когда вы вызываете MEX-функцию, необходимо обеспечить значения, которые совпадают со значениями времени компиляции. Можно управлять, включает ли подпись MEX-функции постоянные входные параметры и проверяет ли MEX-функция значения, что вы предусматриваете постоянные входные параметры. Смотрите, что Постоянный Входной параметр Регистрируется в MEX-функциях.

Определение структуры как постоянный входной параметр

Предположим, что вы задаете структуру tmp в MATLAB workspace, чтобы задать размерности матрицы:

tmp = struct('rows', 2, 'cols', 3);

Следующая функция MATLAB rowcol принимает структуру, ввела p, чтобы задать матричный y:

function y = rowcol(u,p) %#codegen
y = zeros(p.rows,p.cols) + u;

Следующий пример показывает, как указать, что первичный входной параметр, u является двойным скалярным переменным и первичным входным параметром p, является постоянной структурой:

codegen rowcol -args {0,coder.Constant(tmp)}

Задайте вводы Переменного Размера в командной строке

Данные переменного размера являются данными, размер которых может измениться во время выполнения. Поддержки MATLAB ограниченные и неограниченные данные переменного размера для генерации кода. Ограниченные данные переменного размера зафиксировали верхние границы. Это данные может быть выделено статически на стеке или динамически на куче. Неограниченные данные переменного размера не имеют зафиксированных верхних границ. Это данные должно быть выделено на куче. Можно задать входные параметры, чтобы иметь одну или несколько размерностей переменного размера — и задать их верхние границы — использование опции -args и функции coder.typeof:

-args {coder.typeof(example_value, size_vector, variable_dims)}
Задает входной параметр переменного размера с:

  • Тот же класс и сложность как example_value

  • Тот же размер и верхние границы как size_vector

  • Переменные размерности заданы variable_dims

Когда вы включаете динамическое выделение памяти, можно задать Inf в векторе размера для размерностей с неизвестными верхними границами во время компиляции.

Когда variable_dims является скаляром, он применяется ко всем размерностям за следующими исключениями:

  • Если размерность равняется 1 или 0, которые фиксируются.

  • Если размерность неограниченна, который всегда является переменным размером.

Для получения дополнительной информации смотрите coder.typeof и Сгенерируйте Код для Данных Переменного Размера.

Определение входного параметра вектора Переменного Размера

  1. Запишите функцию, которая вычисляет среднее число каждого n элементы векторного A и хранит их в векторном B:

    function B = nway(A,n) %#codegen
    % Compute average of every N elements of A and put them in B.
    
    coder.extrinsic('error');
    if ((mod(numel(A),n) == 0) && (n>=1 && n<=numel(A)))
        B = ones(1,numel(A)/n);
        k = 1;
        for i = 1 : numel(A)/n
             B(i) = mean(A(k + (0:n-1)));
             k = k + n;
        end
    else
        B = zeros(1,0);
        error('n <= 0 or does not divide number of elements evenly');
    end
    

  2. Задайте первый входной параметр A как вектор двойных значений. Его первая размерность остается фиксированной в размере, и его второе измерение может вырасти до верхней границы 100. Задайте второй входной параметр n как двойной скаляр.

    codegen -report nway -args {coder.typeof(0,[1 100],1),1} 
  3. Как альтернатива, присвойте выражение coder.typeof переменной MATLAB, затем передайте переменную в качестве аргумента к -args:

    vareg = coder.typeof(0,[1 100],1)
    codegen -report nway -args {vareg, 0}

Похожие темы

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