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

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

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

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

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

assert ( isa ( param, 'class_name') )

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

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

Примечание

Если вы задаете класс входного параметра равным fi, вы также должны задать его 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, см. «Задание числового типа входа с фиксированной точкой». Можно также задать его 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'));
...

Чтобы задать свойства элементов массива ячеек, см. Раздел «Задание свойств массивов ячеек».

Задайте любой размер

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));
...

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

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

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

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

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

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

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

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

СвойствоЗначение
классfi
numerictypenumerictype T объекта, как указано в основной функции
fimathfimath 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 double.

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

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

Примечание

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

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

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

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 является значением по умолчанию.