Для генерации кода можно использовать функцию MATLAB® assert
, чтобы задать свойства входных параметров первичной функции непосредственно в файле MATLAB.
Используйте функцию assert
, чтобы вызвать стандартные функции MATLAB для определения класса, размера и сложности входных параметров первичной функции.
При определении входных свойств с помощью функции assert
используйте один из следующих методов. Используйте точный синтаксис, который обеспечивается; не изменяйте его.
assert ( isa ( param, 'class_name') )
Устанавливает входной параметр param
на класс MATLAB class_name
. Например, чтобы установить класс входного параметра U
к 32-битному целому числу со знаком, вызовите:
... assert(isa(U,'int32')); ...
assert ( isfi ( param ) ) assert ( isa ( param, 'embedded.fi' ) )
Устанавливает входной параметрический усилитель параметра на класс MATLAB fi
(фиксированная точка числовой объект). Например, чтобы установить класс входного параметра U
к fi
, вызовите:
... assert(isfi(U)); ...
или
... assert(isa(U,'embedded.fi')); ...
Необходимо задать и класс fi
и numerictype
. Смотрите Задают numerictype Входного параметра Фиксированной точки. Можно также установить свойства fimath
, видеть, Задают fimath Входного параметра Фиксированной точки. Если вы не устанавливаете свойства fimath
, 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')); ...
Чтобы задать свойства элементов массива ячеек, смотрите Specifying Properties Массивов ячеек.
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
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
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
. Смотрите Задают numerictype Входного параметра Фиксированной точки. Можно также установить свойства fimath
. Смотрите Задают fimath Входного параметра Фиксированной точки. Если вы не устанавливаете свойства fimath
, 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
.
Чтобы задать класс MATLAB cell
(массив ячеек), используйте один из следующих синтаксисов:
assert(iscell(param)) assert(isa( param, 'cell'))
Например, чтобы установить класс входного параметра C
к cell
, используйте:
... assert(iscell(C)); ...
или
... assert(isa(C, 'cell')); ...
Можно также задать размер массива ячеек и свойства элементов массива ячеек. Число элементов, которое вы задаете, определяет, является ли массив ячеек гомогенным или неоднородным. Смотрите Генерацию кода для Массивов ячеек.
Если вы задаете свойства первого элемента только, массив ячеек является гомогенным. Например, следующий код указывает, что C
1x3 гомогенный массив ячеек, элементы которого 1x1 дважды.
... 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 дважды.
... 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')); ...
Предположим что вы defineS
как следующая скалярная структура 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
как следующее 1 2 массив структур MATLAB:
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'));