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

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

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

Используя функции multisignature 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 function, в командной строке 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 functions, в командной строке 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 не поддерживает:

См. также

|

Похожие темы