Задайте входные свойства программно в файле MATLAB

Для генерации кода можно использовать MATLAB® assert функция для определения свойств входных параметров первичной функции непосредственно в файле MATLAB.

Как использовать assert с MATLAB Coder

Используйте assert функция для вызова стандартных функций MATLAB для определения класса, размера и сложности входных параметров первичной функции.

При определении входных свойств используйте assert function, использовать один из следующих методов. Используйте точный синтаксис, который предоставляется; не изменять его.

Задайте любой класс

assert ( isa ( param, 'class_name') )

Устанавливает входной параметр param к классу MATLAB class_name. Для примера задать класс входа U в 32-битное целое число со знаком вызовите:

... 
assert(isa(U,'int32'));
...

Задайте класс fi

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.

Задайте fimath входа с фиксированной точкой

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 чтобы задать свойства входных параметров первичной функции, следуйте следующим правилам:

  • Функции 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
numerictypenumerictype T объекта, как указано в основной функции
fimathfimath 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'));
Единственный способ назвать поле в структуре - задать хотя бы одно из его свойств. Как минимум, необходимо задать класс всех полей.