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

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

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

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

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

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

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

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

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

  

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

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

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

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

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

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

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

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

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

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

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

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

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

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

МетодПреимуществаНедостатки
 
  • Если вы работаете в проекте, простом в использовании

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

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

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

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

Примечание

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Можно также создать coder.Type объекты в интерактивном режиме при помощи Редактора типов Кодера. Смотрите Создают и Входные Типы Редактирования при помощи Редактора типов Кодера (MATLAB Coder).

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

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

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

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

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

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

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

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

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

function y = emcf(u,v) %#codegen
% The directive %#codegen indicates that you
% intend to generate code for this algorithm
y = u + v;

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

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

    fiaccel -o emcfx emcf ...
       -args {fi(0,1,16,15),fi(0,1,16,15)}

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

    fiaccel -o emcfx emcf ...
       -args {zeros(1,4,'uint16'),fi(0,1,16,15)}

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

    a = fi([1;2;3;4],0,8,0)
    b = fi([5;6;7;8],0,8,0)
    ex = {a,b}
    fiaccel -o emcfx emcf -args ex

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

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

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

Задавать свойства первичного входа x фиксированной точки на примере на командной строке MATLAB, выполните эти шаги:

  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 использование fiaccel команда, передавая переменную myeg в качестве аргумента к the-args опция, как в этом примере:

    fiaccel sqrtfi -args myeg;

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

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

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

-args {coder.Constant(constant_input)}

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

fiaccel постоянная функция компиляций вводит в сгенерированный код. В результате подпись MEX-функции отличается от подписи функции MATLAB. Во время выполнения вы предоставляете аргумент константы к функции MATLAB, но не к MEX-функции.

Например, рассмотрите следующий функциональный identity который копирует его вход в его выход:

function y = identity(u) %#codegen
y = u;

Сгенерировать MEX-функцию identity_mex с постоянным входом введите следующую команду в подсказке MATLAB:

fiaccel -o identity_mex identity...
    -args {coder.Constant(fi(0.1,1,16,15))}

Чтобы запустить функцию MATLAB, предоставьте аргумент константы можно следующим образом:

identity(fi(0.1,1,16,15))

Вы получаете следующий результат:

ans =

    0.1000

Теперь попытайтесь запустить MEX-функцию с этой командой:

identity_mex

Необходимо получить тот же ответ.

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

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

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

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

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

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

fiaccel rowcol ...
   -args {fi(0,1,16,15),coder.Constant(tmp)}

Чтобы запустить этот код, использовать

u = fi(0.5,1,16,15)
y_m = rowcol(u,tmp)

y_mex = rowcol_mex(u)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    vareg = coder.typeof(fi(0,1,16,15,'SumMode','KeepLSB'),[1 100],1)
    fiaccel nway -args {vareg, double(0)} -report

Похожие темы