exponenta event banner

Задание свойств входов функции точки входа

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

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

Если для указания неиспользуемых входов функций используется символ тильды (~):

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

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

Свойства для указания

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

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

Каждое поле в структурном вводе

 Укажите свойства для каждого поля в соответствии с его классом

Прочие вводы

  

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

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

СобственностьДефолт
классdouble
размерscalar
сложностьreal
numerictypeПо умолчанию нет
fimathMATLAB по умолчанию fimath объект

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

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

RoundingMethod: Nearest
OverflowAction: Saturate
ProductMode: FullPrecision
SumMode: FullPrecision
CastBeforeSum: true
Дополнительные сведения см. в разделе fimath для совместного использования арифметических правил (конструктор фиксированных точек).

При выполнении функций 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

Задание нескольких сигнатур для функции MEX.  Чтобы создать функцию MEX с несколькими знаками из функции начального уровня, предоставьте несколько -args спецификации для одной и той же функции точки входа. Созданная функция MEX работает с несколькими сигнатурами, которые предоставляются при создании кода. Дополнительные сведения о multisignature MEX см. в разделе Создание одной функции MEX для нескольких сигнатур.

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

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

Имя классаОписание
logicalЛогический массив значений true и false
charСимвольный массив
int88-битный целочисленный массив со знаком
uint88-битный беззнаковый целочисленный массив
int1616-битный целочисленный массив со знаком
uint1616-битный беззнаковый целочисленный массив
int3232-разрядный целочисленный массив со знаком
uint3232-разрядный беззнаковый целочисленный массив
int6464-битный целочисленный массив со знаком
uint6464-разрядный целочисленный массив без знака
singleМассив чисел с плавающей или фиксированной точкой с одинарной точностью
doubleМассив чисел с плавающей или фиксированной точкой с двойной точностью
structСтруктурный массив
embedded.fiМассив чисел с фиксированной точкой

Правила определения свойств первичных входных данных

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

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

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

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

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

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

Методы определения свойств первичных вводов

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

Задание свойств входов функции точки входа с помощью приложения

  • При работе в проекте MATLAB Coder простота в использовании

  • Не изменяет исходный код MATLAB

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

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

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

Примечание

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

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

  • Не изменяет исходный код MATLAB

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

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

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

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

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

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

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

  • Использует сложный синтаксис

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

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

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

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

Можно передать тип вывода из одной функции точки входа в качестве ввода в другую. См. раздел Передача вывода функции точки входа в качестве ввода. Сведения об указании входов массива ячеек см. в разделе Указание входов массива ячеек в командной строке.

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

Можно также создать coder.Type объектов в интерактивном режиме с помощью редактора типов кодеров. См. раздел Создание и редактирование типов ввода с помощью редактора типов кодеров.

Правила использования параметра -args

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

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

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

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

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

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

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

Рассмотрим функцию 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

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

Для создания функции 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 или C++ сигнатуры функций не содержат постоянных входных данных. По умолчанию сигнатуры функций MEX содержат постоянные входные данные. При вызове функции MEX необходимо указать значения, соответствующие значениям времени компиляции. Можно управлять тем, включает ли сигнатура функции MEX постоянные входы и проверяет ли функция MEX значения, которые предоставляются для постоянных входов. См. раздел Постоянная проверка ввода в функциях MEX.

Задание структуры в качестве постоянного ввода

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

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}

Связанные темы