exponenta event banner

Программное определение входных свойств в файле 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));
...

Задать фиматр ввода с фиксированной точкой

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

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

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

Примечание

Единственный способ назвать поле в структуре - это задать хотя бы одно из его свойств. Поэтому в предыдущем примере 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 является значением по умолчанию.