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

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

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

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

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

assert ( isa ( param, 'class_name') )

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

...
assert(isa(U,'embedded.fi'));
...

Примечание

Если вы устанавливаете класс входного параметра к fi, необходимо также установить его numerictype, видеть, Задают numerictype Входа Фиксированной точки. Можно также установить его свойства fimath, видеть, Задают fimath Входа Фиксированной точки.

Если вы устанавливаете класс входного параметра к struct, необходимо задать свойства каждого поля в структуре в порядке, в котором вы задаете поля в определении структуры.

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

assert ( isfi ( param ) )
assert ( isa ( param, 'embedded.fi' ) )

Устанавливает входной параметр param на класс MATLAB fi (фиксированная точка числовой объект). Например, чтобы установить класс входа U к fi, вызовите:

...
assert(isfi(U));
...
или
...
assert(isa(U,'embedded.fi'));
...

Примечание

Если вы устанавливаете класс входного параметра к fi, необходимо также установить его numerictype, видеть, Задают numerictype Входа Фиксированной точки. Можно также установить его свойства fimath, видеть, Задают fimath Входа Фиксированной точки.

Задайте класс структуры

assert ( isstruct ( param ) )

Устанавливает входной параметр 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 ( isreal (param ) )

Указывает, что входной параметр param действителен. Например, чтобы указать, что вход U действителен, вызовите:

...
assert(isreal(U));
...

Задайте комплексный вход

assert ( ~isreal (param ) )

Указывает, что входной параметр param является комплексным. Например, чтобы указать, что вход U является комплексным, вызовите:

...
assert(~isreal(U));
...

Задайте numerictype Входа Фиксированной точки

assert ( isequal ( numerictype ( fiparam ), T ) )

Устанавливает свойства numerictype параметра входа fi fiparam к объекту numerictype T. Например, чтобы задать свойство numerictype входа U фиксированной точки как объект numerictype со знаком T с 32-битным размером слова и 30-битной дробной длиной, используйте следующий код:

...
% Define the numerictype object.
T = numerictype(1, 32, 30);

% Set the numerictype property of input U to T.
assert(isequal(numerictype(U),T));
...

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

assert ( isequal ( fimath ( fiparam ), F ) )

Устанавливает свойства fimath параметра входа fi fiparam к объекту fimath F. Например, чтобы задать свойство fimath входа U фиксированной точки так, чтобы это насыщало на целочисленном переполнении, используйте следующий код:

...
% Define the fimath object.
F = fimath('OverflowAction','Saturate');

% Set the fimath property of input U to F.
assert(isequal(fimath(U),F));
... 

Задайте несколько свойств входа

assert ( function1 ( params ) && function2 ( params ) && function3 ( params ) && ... )

Задает класс, размер и сложность одних или нескольких входных параметров с помощью одного вызова функции assert. Например, следующий код указывает, что вход U является двойной, комплексной, 3х3 матрицей, и вход V является 16-битным беззнаковым целым:

...
assert(isa(U,'double') && ~isreal(U) && all(size(U) == [3 3]) && isa(V,'uint16'));
... 

Правила для Использования утверждают Функцию

Следуйте этим правилам при использовании функции assert, чтобы задать свойства входных параметров первичной функции:

  • Вызовите функции assert в начале первичной функции перед любыми операциями управления потоками, такими как операторы if или вызовы подпрограммы.

  • Не вызывайте функции assert в условных построениях, таких как if, for, while и операторы switch.

  • Если вы устанавливаете класс входного параметра к fi:

  • Если вы устанавливаете класс входного параметра к struct, необходимо задать класс, размер и сложность каждого поля в структуре в порядке, в котором вы задаете поля в определении структуры.

Определение свойств первичных входных параметров фиксированной точки

В следующем примере первичная функция MATLAB emcsqrtfi берет один вход фиксированной точки: x. Код задает следующие свойства для этого входа:

СвойствоЗначение
классfi
numerictypeОбъект numerictype T, как задано в первичной функции
fimathОбъект fimath F, как задано в первичной функции
размерscalar (по умолчанию)
сложностьreal (по умолчанию)

function y = emcsqrtfi(x)
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);

Определение свойств Массивов ячеек

Чтобы задать класс MATLAB cell (массив ячеек), используйте один из следующих синтаксисов:

assert(iscell(param))
assert(isa( param, 'cell'))

Например, чтобы установить класс входа C к cell, используйте:

...
assert(iscell(C));
...

или

...
assert(isa(C, 'cell'));
...

Можно также задать размер массива ячеек и свойства элементов массива ячеек. Число элементов, которое вы задаете, определяет, является ли массив ячеек гомогенным или неоднородным. Смотрите Генерацию кода для Массивов ячеек (MATLAB Coder).

Если вы задаете свойства первого элемента только, массив ячеек является гомогенным. Например, следующий код указывает, что C 1x3 гомогенный массив ячеек, элементы которого 1x1 дважды.

...
assert(isa(C, 'cell'));
assert(all(size(C) == [1  3]));
assert(isa(C{1}, 'double'));
...

Если вы задаете свойства каждого элемента, массив ячеек неоднороден. Например, следующий код задает 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'));
...

Определение класса и размера скалярной структуры

Примите, что вы задали S как следующую скалярную структуру MATLAB:

S = struct('r',double(1),'i',fi(4,true,8,0));
Этот код задает класс и размер S и его полей, когда передано как вход к вашей функции MATLAB:
function y = fcn(S)

% Specify the class of the input as struct.
assert(isstruct(S));

% Specify the size of the fields r and i
% in the order in which you defined them.
T = numerictype('Wordlength', 8,'FractionLength', ...
   0,'signed',true);
assert(isa(S.r,'double'));
assert(isfi(S.i) && isequal(numerictype(S.i),T));

y = S;

Примечание

Единственный способ назвать поле в структуре состоит в том, чтобы установить по крайней мере одно из своих свойств. Поэтому в предыдущем примере, функция assert указывает, что поле S.r имеет тип double, даже при том, что double является значением по умолчанию.

Определение класса и размера массива структур

Для массивов структур необходимо выбрать представительный элемент массива для определения свойств каждого поля. Например, примите, что вы задали S как следующее 1 2 массив структур MATLAB:

S = struct('r',{double(1), double(2)},'i',...
   {fi(4,1,8,0), fi(5,1,8,0)});

Следующий код задает класс и размер каждого поля входа S структуры с помощью первого элемента массива:

function y = fcn(S)

% Specify the class of the input S as struct.
assert(isstruct(S));
T = numerictype('Wordlength', 8,'FractionLength', ...
   0,'signed',true);

% 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(isfi(S(1).i) && isequal(numerictype(S(1).i),T));

y = S;

Примечание

Единственный способ назвать поле в структуре состоит в том, чтобы установить по крайней мере одно из своих свойств. Поэтому в примере выше, функция assert указывает, что поле S(1).r имеет тип double, даже при том, что double является значением по умолчанию.