Поскольку C и C++ являются статически типизированными языками, MATLAB® Coder™ должен определить свойства всех переменных в файлах MATLAB во время компиляции. Чтобы вывести переменные свойства в файлах MATLAB, MATLAB Coder должен смочь идентифицировать свойства входных параметров к первичной функции, также известной как функцию или точки входа верхнего уровня. Поэтому, если ваша первичная функция имеет входные параметры, необходимо задать свойства этих входных параметров к MATLAB Coder. Если ваша первичная функция не имеет никаких входных параметров, MATLAB Coder может скомпилировать ваш файл MATLAB без модификации. Вы не должны задавать свойства входных параметров к локальным функциям или внешним функциям, вызванным первичной функцией.
Если вы используете тильду (~) символ, чтобы задать неиспользованные входные параметры функции:
В проектах MATLAB Coder, если вы хотите, чтобы другой тип появился в сгенерированном коде, задают тип. В противном случае входное значение по умолчанию к действительному, скалярному удваивается.
При генерации кода с codegen
, необходимо задать тип этих входных параметров с помощью -args
опция.
Если ваша первичная функция имеет входные параметры, необходимо задать следующие свойства для каждого входа.
Для | Задайте свойства | ||||
---|---|---|---|---|---|
Класс | Размер | Сложность | numerictype | fimath | |
Входные параметры фиксированной точки |
|
|
|
|
|
Каждое поле в структуре вводится | |||||
Другие входные параметры |
|
|
|
MATLAB Coder присваивает следующие значения по умолчанию для свойств входных параметров первичной функции.
Свойство | Значение по умолчанию |
---|---|
класс | double |
размер | scalar |
сложность | real |
numerictype | Никакое значение по умолчанию |
fimath | Значение по умолчанию MATLAB fimath объект |
Определение Значений по умолчанию для Полей Структуры. В большинстве случаев, когда вы явным образом не задаете значения для свойств, MATLAB Coder использует значения по умолчанию за исключением полей структуры. Единственный способ назвать поле в структуре состоит в том, чтобы установить по крайней мере одно из своих свойств. Поэтому вы можете должны быть задать значения по умолчанию для свойств полей структуры. Для примеров смотрите Класс Определения и Размер Скалярной Структуры и Определения Класса и Размера Массива структур.
Определение Значения по умолчанию fimath Значения для MEX-функций. MEX-функции, сгенерированные с MATLAB Coder, используют fimath
по умолчанию значение в действительности во время компиляции. Если вы не задаете
fimath
по умолчанию значение, MATLAB Coder использует значение по умолчанию 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-функция работает с несколькими подписями, которые вы обеспечиваете во время генерации кода. Для получения дополнительной информации о MEX мультиподписи смотрите, Генерируют Одну MEX-функцию Который Поддержки Несколько Подписей.
Следующая таблица представляет имена классов, поддержанные MATLAB Coder.
ClassName | Описание |
---|---|
logical | Логический массив истинных и ложных значений |
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 or 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 ограниченные и неограниченные данные переменного размера для генерации кода. 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, которые фиксируются.
Если размерность неограниченна, который всегда является переменным размером.
Для получения дополнительной информации смотрите 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}