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