Поскольку C и C++ являются статически типизированными языками, MATLAB ® Coder™ должен определять свойства всех переменных в файлах MATLAB во время компиляции. Чтобы определить переменные свойства в файлах MATLAB, кодер MATLAB должен быть способен идентифицировать свойства входов в основную функцию, также известную как функция верхнего уровня или начальной точки. Поэтому, если основная функция имеет входы, необходимо указать свойства этих входов в кодере MATLAB. Если основная функция не имеет входных параметров, кодер MATLAB может компилировать файл MATLAB без изменений. Нет необходимости задавать свойства входов для локальных функций или внешних функций, вызываемых основной функцией.
Если для указания неиспользуемых входов функций используется символ тильды (~):
Если в проектах MATLAB Coder требуется, чтобы в созданном коде отображался другой тип, укажите тип. В противном случае входные значения по умолчанию становятся вещественными, скалярными и удваиваются.
При создании кода с помощью codegen, необходимо указать тип этих входных данных с помощью -args вариант.
Если основная функция имеет входы, необходимо указать следующие свойства для каждого входа.
| Для | Укажите свойства | ||||
|---|---|---|---|---|---|
| Класс | Размер | Сложность | numerictype | fimath | |
| Вводы с фиксированной точкой |
|
|
|
|
|
| Каждое поле в структурном вводе |
| ||||
| Прочие вводы |
|
|
| ||
Кодер MATLAB назначает следующие значения по умолчанию для свойств входов первичных функций.
| Собственность | Дефолт |
|---|---|
| класс | double |
| размер | scalar |
| сложность | real |
numerictype | По умолчанию нет |
fimath | MATLAB по умолчанию fimath объект |
Задание значений по умолчанию для полей структуры. В большинстве случаев, когда значения свойств явно не указываются, кодер MATLAB использует значения по умолчанию, за исключением полей структуры. Единственный способ назвать поле в структуре - это задать хотя бы одно из его свойств. Поэтому может потребоваться указать значения по умолчанию для свойств полей структуры. Примеры см. в разделах Задание класса и размера скалярной структуры и Задание класса и размера структурного массива.
Задание значений fimath по умолчанию для функций MEX. Функции MEX, созданные с помощью кодера MATLAB, используют значение по умолчанию fimath значение, действующее во время компиляции. Если не указано значение по умолчанию fimath значение, кодер MATLAB использует значение по умолчанию MATLAB fimath. Фабрика MATLAB по умолчанию имеет следующие свойства:
RoundingMethod: Nearest OverflowAction: Saturate ProductMode: FullPrecision SumMode: FullPrecision CastBeforeSum: true
При выполнении функций 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 | Символьный массив |
int8 | 8-битный целочисленный массив со знаком |
uint8 | 8-битный беззнаковый целочисленный массив |
int16 | 16-битный целочисленный массив со знаком |
uint16 | 16-битный беззнаковый целочисленный массив |
int32 | 32-разрядный целочисленный массив со знаком |
uint32 | 32-разрядный беззнаковый целочисленный массив |
int64 | 64-битный целочисленный массив со знаком |
uint64 | 64-разрядный целочисленный массив без знака |
single | Массив чисел с плавающей или фиксированной точкой с одинарной точностью |
double | Массив чисел с плавающей или фиксированной точкой с двойной точностью |
struct | Структурный массив |
embedded.fi | Массив чисел с фиксированной точкой |
При задании свойств первичных входных данных следуйте следующим правилам:
Порядок элементов в массиве ячеек должен соответствовать порядку, в котором входные данные появляются в сигнатуре первичной функции. Например, первый элемент в массиве ячеек определяет свойства первого ввода первичной функции.
Чтобы создать меньше аргументов, чем в функции MATLAB, укажите свойства только для нужного количества аргументов в созданной функции.
Если функция MATLAB имеет входные аргументы, для создания функции, не имеющей входных аргументов, передайте пустой массив ячеек в -args.
Для каждого входа первичной функции, класс которой является фиксированной точкой (fi), укажите входные данные numerictype и fimath свойства.
Для каждого входа основной функции, класс которого structукажите свойства каждого поля в том порядке, в котором они отображаются в определении структуры.
| Метод | Преимущества | Недостатки |
|---|---|---|
Задание свойств входов функции точки входа с помощью приложения |
|
|
Определение входных свойств по примеру в командной строке Примечание При программном определении входных свойств в файле MATLAB использовать этот метод невозможно. |
|
|
|
|
Задание свойств первичных входных данных по примеру в командной строке
Задание свойств первичных вводов с фиксированной точкой по примеру в командной строке
codegen функция предоставляет параметр командной строки -args для задания свойств входных данных первичных (точек входа) функций в виде массива ячеек с примерами значений или типов. Массив ячеек может быть переменным или литеральным массивом констант. С помощью этой опции можно задать свойства входных данных одновременно с созданием кода для функции MATLAB с помощью codegen.
Можно передать тип вывода из одной функции точки входа в качестве ввода в другую. См. раздел Передача вывода функции точки входа в качестве ввода. Сведения об указании входов массива ячеек см. в разделе Указание входов массива ячеек в командной строке.
При наличии тестовой функции или скрипта, вызывающего функцию MATLAB начального уровня с требуемыми типами, можно использовать coder.getArgTypes для определения типов входов функций. coder.getArgTypes возвращает массив ячеек coder.Type объекты, которые можно передать codegen с использованием -args вариант. См. раздел Задание общих свойств первичных входных данных для codegen.
Можно также создать coder.Type объектов в интерактивном режиме с помощью редактора типов кодеров. См. раздел Создание и редактирование типов ввода с помощью редактора типов кодеров.
При использовании -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 В качестве примера выполните следующие действия.
Определите numerictype свойства для x, например:
T = numerictype('WordLength',32,...
'FractionLength',23,...
'Signed',true);Определите fimath свойства для x, например:
F = fimath('SumMode','SpecifyPrecision',...
'SumWordLength',32,...
'SumFractionLength',23,...
'ProductMode','SpecifyPrecision',...
'ProductWordLength',32,...
'ProductFractionLength',23);Создание переменной с фиксированной точкой с помощью numerictype и fimath определенные свойства, например:
myeg = { fi(4.0,T,F) };Скомпилировать функцию 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 и Создать код для данных переменного размера.
Записать функцию, которая вычисляет среднее для каждого 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
Укажите первый вход A как вектор двойных значений. Его первый размер остается фиксированным по размеру, а второй размер может вырасти до верхней границы 100. Укажите второй вход n как двойной скаляр.
codegen -report nway -args {coder.typeof(0,[1 100],1),1} В качестве альтернативы присвойте coder.typeof выражение переменной MATLAB, затем передайте переменную в качестве аргумента -args:
vareg = coder.typeof(0,[1 100],1)
codegen -report nway -args {vareg, 0}