exponenta event banner

Создание одной функции MEX для нескольких сигнатур

Функция начального уровня - это функция верхнего уровня MATLAB ®, из которой создается код. Если входная функция имеет входы, необходимо указать свойства входов для создания MEX-функции. В этом случае сгенерированная функция MEX работает только с сигнатурой функции точки входа, указанной при создании кода.

Если функция начального уровня поддерживает несколько сигнатур, можно создать одну функцию MEX вместо создания отдельной функции MEX для каждой сигнатуры. Сгенерированная функция MEX работает с несколькими сигнатурами, предоставляемыми во время генерации кода.

Используя функции MEX с несколькими знаками, можно:

  • Создайте одну функцию MEX, поддерживающую несколько сигнатур, указанных в функции точки входа.

  • Сократите издержки, связанные с созданием и использованием отдельных функций MEX для каждой сигнатуры функции начального уровня.

  • Достижение функционального поведения MATLAB в сгенерированной функции MEX.

Создание функции MEX с несколькими знаками для функции с одной точкой входа

Чтобы создать функцию MEX с несколькими знаками, рассмотрите эту функцию. myAdd:

function y = myAdd(a,b)
%#codegen
y = a+b;
end
Предположим, что необходимо создать функцию MEX из myAdd который работает с тремя различными типами данных: double, int8, и vector of doubles. Укажите три аргумента как: {1,2}, {int8(2), int8(3)}, и {1:10, 1:10}. Указывается функция точки входа, за которой следует -args для каждой подписи функции точки входа.

Создание кода для myAdd в командной строке MATLAB выполните эту команду codegen команда:

codegen -config:mex myAdd.m -args {1,2} -args {int8(2),int8(3)} -args {1:10,1:10} -report
Этот синтаксис создает одну функцию MEX myAdd_mex для подписей, указанных в codegen команда.

В командной строке вызовите сгенерированную функцию MEX myAdd_mex. Убедитесь, что переданные значения myAdd_mex соответствуют входным свойствам, указанным в codegen команда.

myAdd_mex(3,4)
ans =

     7
myAdd_mex(int8(5),int8(6))
ans =

  int8

   11
myAdd_mex(1:10,2:11)
ans =

     3     5     7     9    11    13    15    17    19    21

Выполнение функции MATLAB myAdd с этими входными значениями выдает один и тот же выходной сигнал. Эти тестовые примеры подтверждают, что myAdd и myAdd_mex имеют то же поведение.

Создание функции MEX с несколькими знаками для нескольких функций точек входа

Во время создания кода можно также создать одну функцию MEX для нескольких функций точки входа, содержащих несколько сигнатур.

Предположим, что у вас есть две функции точки входа myAdd и myMul. Первая функция точки входа, myAdd возвращает сумму двух значений:

function y = myAdd(a,b)
%#codegen
y = a+b;
end

Вторая функция точки входа, myMul возвращает умножение двух значений:

function y = myMul(a,b)
%#codegen
y = a*b;
end

Указывается функция точки входа, за которой следует -args для каждой подписи функции точки входа. Учтите, что функция myAdd поддерживает типы ввода double и int8. Укажите следующие аргументы: {1,2} и {int8(1), int8(2)}. Аналогично, если функция myMul поддерживает типы ввода double и int16, укажите следующие аргументы: {1,2} и {int16(1), int16(2)}. Теперь можно создать функцию MEX из функций начального уровня.

Создание кода для myAdd и myMul функции, в командной строке MATLAB, выполните это codegen команда:

codegen -config:mex myAdd.m -args {1,2} -args {int8(1),int8(2)} myMul.m -args {1,2} -args {int16(1),int16(2)} -o 'myMath' -report

Этот синтаксис генерирует одну функцию MEX myMath для всех подписей, указанных в codegen команда.

Выходные значения можно проверить с помощью созданной функции MEX. myMath в командной строке. Убедитесь, что переданные значения myMath соответствует входным свойствам, указанным перед созданием кода.

myMath("myAdd",3,4)
ans =

     7
myMath("myAdd",int8(5),int8(6))
ans =

   int8 
   11
myMath("myMul",3,4)
ans =

     12
myMath("myMul",int16(5),int16(6))
ans =

    int16
    30

Выполнение функции MATLAB myAdd и myMul с этими входными значениями выдает один и тот же выходной сигнал. Эти тестовые примеры подтверждают, что myAdd, myMulи сгенерированная функция MEX myMath имеют то же поведение.

Ограничения

Генерация MEX с несколькими знаками не поддерживает:

См. также

|

Связанные темы