Для генерации кода можно использовать MATLAB® assert
функция для определения свойств входных параметров первичной функции непосредственно в файле MATLAB.
Используйте assert
функция для вызова стандартных функций MATLAB для определения класса, размера и сложности входных параметров первичной функции.
При определении входных свойств используйте assert
function, использовать один из следующих методов. Используйте точный синтаксис, который предоставляется; не изменять его.
Задайте верхние границы для входных параметров переменного размера
Задайте входы с размерностями фиксированного и переменного размера
assert ( isa ( param, 'class_name') )
Устанавливает входной параметр param
к классу MATLAB class_name
. Для примера задать класс входа U
в 32-битное целое число со знаком вызовите:
... assert(isa(U,'int32')); ...
assert ( isfi ( param ) ) assert ( isa ( param, 'embedded.fi' ) )
Устанавливает входной параметр, param к классу MATLAB fi
(Fixed-Point Designer) (численный объект с фиксированной точкой). Для примера задать класс входа U
на fi
, вызовите:
... assert(isfi(U)); ...
или
... assert(isa(U,'embedded.fi')); ...
Вы должны задать оба fi
класс и numerictype
(Fixed-Point Designer). См. «Задание числового типа входа с фиксированной точкой». Можно также задать fimath
(Fixed-Point Designer) свойства, см., Задайте fimath входа с фиксированной точкой. Если вы не устанавливаете fimath
(Fixed-Point Designer) свойства, codegen
использует MATLAB по умолчанию fimath
значение.
assert ( isstruct ( param ) ) assert ( isa ( param, 'struct' ) )
Устанавливает входной параметр param
в класс MATLAB struct
(структура). Для примера задать класс входа U
в struct
, вызовите:
... assert(isstruct(U)); ...
или
... assert(isa(U, 'struct')); ...
Если вы задаете класс входного параметра равным struct
необходимо задать свойства всех полей в том порядке, в котором они появляются в определении структуры.
assert(iscell( param)) assert(isa(param, 'cell'))
Устанавливает входной параметр param
в класс MATLAB cell
(массив ячеек). Для примера задать класс входа C
в cell
, вызовите:
... assert(iscell(C)); ...
или
... assert(isa(C, 'cell')); ...
Чтобы задать свойства элементов массива ячеек, см. Раздел «Задание свойств массивов ячеек».
assert ( all ( size (param) == [dims ] ) )
Устанавливает входной параметр param
к размеру, который dims
задает. Для примера задать размер входа U
в матрицу 3 на 2 вызовите:
... assert(all(size(U)== [3 2])); ...
assert ( isscalar (param ) ) assert ( all ( size (param) == [ 1 ] ) )
Устанавливает размер входа параметра param
к скаляру. Чтобы задать размер входа U
в скаляр вызовите:
... assert(isscalar(U)); ...
... assert(all(size(U)== [1])); ...
assert ( all(size(param)<=[N0 N1 ...])); assert ( all(size(param)<[N0 N1 ...]));
Устанавливает верхний размер каждой размерности входа параметра param
. Чтобы задать верхний размер входа U
чтобы быть меньше или равной матрице 3 на 2, вызовите:
assert(all(size(U)<=[3 2]));
Примечание
Можно также задать верхние границы для входных параметров переменного размера, используя coder.varsize
.
assert ( all(size(param)>=[M0 M1 ...])); assert ( all(size(param)<=[N0 N1 ...]));
Когда вы используете assert(all(size(param)>=[M0 M1 ...]))
чтобы задать нижний размер каждой размерности входного параметра:
Необходимо также задать верхний размер для каждой размерности входного параметра.
Для каждой размерности k
, нижняя граница Mk
должно быть меньше чем или равно верхней оси Nk
.
Чтобы задать размерность фиксированного размера, задайте одно и то же значение для нижней и верхней границы размерности.
Границы должны быть неотрицательными.
Чтобы исправить размер первой размерности входа U
значение 3 и установите второе измерение как размер переменной с верхней границей 2, вызовите:
assert(all(size(U)>=[3 0])); assert(all(size(U)<=[3 2]));
assert (size(param,k
)==Nk
); assert (size(param,k
)<=Nk
); assert (size(param,k
)<Nk
);
Можно задавать отдельные размерности и все размерности одновременно. Можно также задать отдельные размерности вместо одновременного задания всех размерностей. Применяются следующие правила:
Размер каждой размерности необходимо задать хотя бы один раз.
Последняя спецификация размерности имеет приоритет над более ранними спецификациями.
Устанавливает верхний размер размерности k
Вход параметра param
. Чтобы задать верхний размер первой размерности входа U
на 3, позвоните:
assert(size(U,1)<=3)
Чтобы зафиксировать размер второго измерения входа U
на 2 вызовите:
assert(size(U,2)==2)
assert ( isreal (param ) )
Задает, что входной параметр param
реально. Чтобы задать этот входной U
реально, вызов:
... assert(isreal(U)); ...
assert ( ~isreal (param ) )
Задает, что входной параметр param
комплексная. Чтобы задать этот входной U
комплексно, вызов:
... assert(~isreal(U)); ...
assert ( isequal ( numerictype ( fiparam ), T ) )
Устанавливает numerictype
свойства fi
входной параметр fiparam
в numerictype
(Fixed-Point Designer) объект T
. Например, чтобы задать numerictype
свойство входного сигнала с фиксированной точкой U
как подписанный numerictype
T объекта
с 32-битным размером слова и 30-битной дробью используйте следующий код:
%#codegen ... % Define the numerictype object. T = numerictype(1, 32, 30); % Set the numerictype property of input U to T. assert(isequal(numerictype(U),T)); ...
Определение numerictype
для переменной не задает автоматически, что переменная является фиксированной точкой. Вы должны задать оба fi
класс и numerictype
.
assert ( isequal ( fimath ( fiparam ), F ) )
Устанавливает fimath
свойства fi
входной параметр fiparam
в fimath
(Fixed-Point Designer) объект F
. Например, чтобы задать fimath
свойство входного сигнала с фиксированной точкой U
чтобы он насыщался при целочисленном переполнении, используйте следующий код:
%#codegen ... % Define the fimath object. F = fimath('OverflowMode','saturate'); % Set the fimath property of input U to F. assert(isequal(fimath(U),F)); ...
fimath
свойства с использованием assert
, codegen
использует MATLAB по умолчанию fimath
значение.assert ( function1 ( params ) && function2 ( params ) && function3 ( params ) && ... )
Задает класс, размер и сложность одного или нескольких входов с помощью одной assert
вызов функции. Для примера следующий код задает этот вход U
- двойная, комплексная, матрица 3 на 3 и входная V
является 16-битным беззнаковым целым числом:
%#codegen ... assert(isa(U,'double') && ~isreal(U) && all(size(U) == [3 3]) && isa(V,'uint16')); ...
При использовании assert
чтобы задать свойства входных параметров первичной функции, следуйте следующим правилам:
Функции assert
функции в начале основной функции, перед операциями потока управления, такими как if
операторы или стандартные подпрограммы.
Не вызывайте assert
функции внутри условных конструкций, таких как if
, for
, while
, и switch
операторы.
Для входов с фиксированной точкой необходимо задать оба fi
класс и numerictype
(Fixed-Point Designer). См. «Задание числового типа входа с фиксированной точкой». Можно также задать fimath
(Fixed-Point Designer) свойства. См. «Задайте fimath входа с фиксированной точкой». Если вы не устанавливаете fimath
(Fixed-Point Designer) свойства, codegen
использует MATLAB по умолчанию fimath
значение.
Если вы задаете класс входного параметра равным struct
необходимо задать класс, размер и сложность всех полей в том порядке, в котором они отображаются в определении структуры.
Когда вы используете assert(all(size(param)>=[M0 M1 ...]))
чтобы задать нижний размер каждой размерности входного параметра:
Необходимо также задать верхний размер для каждой размерности входного параметра.
Для каждой размерности k
, нижняя граница Mk
должно быть меньше чем или равно верхней оси Nk
.
Чтобы задать размерность фиксированного размера, задайте одно и то же значение для нижней и верхней границы размерности.
Границы должны быть неотрицательными.
Если вы задаете отдельные размерности, применяются следующие правила:
Размер каждой размерности необходимо задать хотя бы один раз.
Последняя спецификация размерности имеет приоритет над более ранними спецификациями.
В следующем фрагменте кода, основная функция MATLAB mcspecgram
принимает два входов: pennywhistle
и win
. Код задает следующие свойства для этих входов.
Вход | Свойство | Значение |
---|---|---|
pennywhistle | класс | int16 |
размер | 220500-на-1 вектор | |
сложность | real (по умолчанию) | |
win | класс | double |
размер | Вектор 1024 на 1 | |
сложность | real (по умолчанию) |
%#codegen function y = mcspecgram(pennywhistle,win) nx = 220500; nfft = 1024; assert(isa(pennywhistle,'int16')); assert(all(size(pennywhistle) == [nx 1])); assert(isa(win, 'double')); assert(all(size(win) == [nfft 1])); ...
Также можно объединить спецификации свойств для одного или нескольких входов внутри assert
команды:
%#codegen function y = mcspecgram(pennywhistle,win) nx = 220500; nfft = 1024; assert(isa(pennywhistle,'int16') && all(size(pennywhistle) == [nx 1])); assert(isa(win, 'double') && all(size(win) == [nfft 1])); ...
Чтобы задать входы с фиксированной точкой, необходимо установить программное обеспечение Fixed-Point Designer™.
В следующем примере основная функция MATLAB mcsqrtfi
принимает один вход с фиксированной точкой x
. Код задает следующие свойства для этого входа.
Свойство | Значение |
---|---|
класс | fi |
numerictype | numerictype T объекта , как указано в основной функции |
fimath | fimath F объекта , как указано в основной функции |
размер | scalar |
сложность | real (по умолчанию) |
function y = mcsqrtfi(x) %#codegen T = numerictype('WordLength',32,'FractionLength',23,... 'Signed',true); F = fimath('SumMode','SpecifyPrecision',... 'SumWordLength',32,'SumFractionLength',23,... 'ProductMode','SpecifyPrecision',... 'ProductWordLength',32,'ProductFractionLength',23); assert(isfi(x)); assert(isequal(numerictype(x),T)); assert(isequal(fimath(x),F)); y = sqrt(x);
Вы должны задать оба fi
класс и numerictype
.
Чтобы задать класс cell
(массив ячеек), используйте один из следующих синтаксисов:
assert(iscell(param)) assert(isa( param, 'cell'))
Для примера задать класс входа C
на cell
, использовать:
... assert(iscell(C)); ...
или
... assert(isa(C, 'cell')); ...
Можно также задать размер массива ячеек и свойства элементов массива ячеек. Количество элементов, которые вы задаете, определяет, является ли массив ячеек однородным или неоднородным. Смотрите Генерацию кода для массивов ячеек.
Если вы задаете свойства только первого элемента, массив ячеек однороден. Например, следующий код указывает, что C
представляет собой однородный массив ячеек 1x3 с элементами 1x1 double.
... assert(isa(C, 'cell')); assert(all(size(C) == [1 3])); assert(isa(C{1}, 'double')); ...
Если вы задаете свойства только первого элемента, но также присвоите имя типа структуры массиву ячеек, массив ячеек неоднороден. Каждый элемент имеет свойства первого элемента. Например, следующий код указывает, что C
представляет собой 1x3 гетерогенный массив ячеек. Каждый элемент является даблом 1x1.
... assert(isa(C, 'cell')); assert(all(size(C) == [1 3])); assert(isa(C{1}, 'double')); coder.cstructname(C, 'myname'); ...
Если вы задаете свойства каждого элемента, массив ячеек неоднороден. Например, следующий код задает 1x2 гетерогенный массив ячеек, первый элемент которого равен 1x1 char, а второй элемент равен 1x3 double.
... assert(isa(C, 'cell')); assert(all(size(C) == [1 2])); assert(isa(C{1}, 'char')); assert(all(size(C{2}) == [1 3])); assert(isa(C{2}, 'double')); ...
Если вы задаете больше одного элемента, вы не можете задать, что массив ячеек имеет переменный размер, даже если все элементы имеют одинаковые свойства. Например, следующий код задает массив ячеек переменного размера. Поскольку код задает свойства первого и второго элементов, генерация кода прекращает работать.
... assert(isa(C, 'cell')); assert(all(size(C) <= [1 2])); assert(isa(C{1}, 'double')); assert(isa(C{2}, 'double')); ...
В предыдущем примере, если вы задаете только первый элемент, можно задать, что массив ячеек имеет переменный размер. Для примера:
... assert(isa(C, 'cell')); assert(all(size(C) <= [1 2])); assert(isa(C{1}, 'double')); ...
Предположим, что вы задаете S
как следующая скалярная структура MATLAB:
S = struct('r',double(1),'i',int8(4));
S
и его полями:function y = fcn(S) %#codegen % Specify the class of the input as struct. assert(isstruct(S)); % Specify the class and size of the fields r and i % in the order in which you defined them. assert(isa(S.r,'double')); assert(isa(S.i,'int8'); ...
В большинстве случаев, когда вы явным образом не задаете значения для свойств, MATLAB Coder™ использует значения по умолчанию - кроме структурных полей. Единственный способ назвать поле в структуре - задать хотя бы одно из его свойств. Как минимум, необходимо задать класс поля структуры.
Для массивов структур необходимо выбрать репрезентативный элемент массива для определения свойств каждого поля. Например, предположим, что вы определили S
как следующий массив структур MATLAB 1 на 2:
S = struct('r',{double(1), double(2)},'i',{int8(4), int8(5)});
Следующий код задает класс и размер каждого поля ввода структуры S
при помощи первого элемента массива:
%#codegen function y = fcn(S) % Specify the class of the input S as struct. assert(isstruct(S)); % Specify the size of the fields r and i % based on the first element of the array. assert(all(size(S) == [1 2])); assert(isa(S(1).r,'double')); assert(isa(S(1).i,'int8'));