exponenta event banner

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

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

Как использовать утверждение с кодером MATLAB

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

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

Указать любой класс

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 (Конструктор фиксированных точек) (числовой объект фиксированных точек). Например, чтобы задать класс ввода 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
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.

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