Для генерации кода можно использовать 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' ) )
Устанавливает входной параметр param на класс MATLAB fi
(Fixed-Point Designer) (фиксированная точка числовой объект). Например, чтобы установить класс входа U
к fi
, вызов:
... assert(isfi(U)); ...
или
... assert(isa(U,'embedded.fi')); ...
Необходимо задать обоих fi
класс и numerictype
(Fixed-Point Designer). Смотрите Задают numerictype Входа Фиксированной точки. Можно также установить 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
CellArray. Например, чтобы установить класс входа 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
isreal. Задавать тот вход 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
для
в то время как
, и switch
операторы.
Для входа фиксированной точки необходимо задать обоих fi
класс и numerictype
(Fixed-Point Designer). Смотрите Задают numerictype Входа Фиксированной точки. Можно также установить 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 дважды.
... 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'));