exponenta event banner

coder.extrinsic

Объявить функцию как внешнюю и выполнить ее в MATLAB

Описание

пример

coder.extrinsic(function) объявляет function как внешняя функция. Генератор кода не создает код для тела внешней функции и вместо этого использует механизм MATLAB ® для выполнения вызова. Эта функция доступна только в том случае, если модуль MATLAB доступен во время выполнения. Примеры ситуаций, в которых доступен механизм MATLAB, включают выполнение функций MEX, моделирование Simulink ® или вызовы функций во время генерации кода (также известное как время компиляции).

Во время генерации автономного кода генератор кода пытается определить, влияет ли внешняя функция на выход функции, в которой она вызывается - например, возвращая mxArrays к выходной переменной. При условии отсутствия изменения выходного сигнала генератор кода осуществляет генерацию кода, но исключает внешнюю функцию из генерируемого кода. В противном случае генератор кода создает ошибку компиляции.

Вы не можете использовать coder.ceval для функций, объявленных как внешние с помощью coder.extrinsic.

coder.extrinsic игнорируется вне создания кода.

Примечание

Генератор кода автоматически обрабатывает многие общие функции визуализации MATLAB, такие как plot, disp, и figure, как внешний. Нет необходимости явно объявлять их как внешние функции с помощью coder.extrinsic.

coder.extrinsic(function1, ... ,functionN) объявляет function1 через functionN как внешние функции.

coder.extrinsic('-sync:on', function1, ... ,functionN) обеспечивает синхронизацию глобальных данных между выполнением MATLAB и сгенерированным выполнением кода или симуляцией Simulink до и после вызовов внешних функций function1 через functionN. Если только несколько внешних вызовов используют или изменяют глобальные данные, отключите синхронизацию до и после всех внешних вызовов функций, установив режим глобальной синхронизации в значение At MEX-function entry and exit. Используйте '-sync:on' включение синхронизации только для внешних вызовов, изменяющих глобальные данные.

См. раздел Создание кода для глобальных данных (кодер MATLAB).

coder.extrinsic('-sync:off', function1, ... ,functionN) отключает синхронизацию глобальных данных между выполнением MATLAB и выполнением сгенерированного кода до и после вызовов внешних функций function1 через functionN. Если большинство внешних вызовов используют или изменяют глобальные данные, но некоторые нет, используйте '-sync:off' для отключения синхронизации внешних вызовов, которые не изменяют глобальные данные.

См. раздел Создание кода для глобальных данных (кодер MATLAB).

Примеры

свернуть все

Функция MATLAB patch не поддерживается для создания кода. В этом примере показано, как можно по-прежнему использовать функциональные возможности patch в созданной функции MEX путем объявления patch как внешняя функция MATLAB.

Этот код MATLAB объявляет patch как внешнее в локальной функции create_plot. Объявлением patch как внешний, вы проинструктируете генератор кода не создавать код для patch. Вместо этого генератор кода отправляет patch в MATLAB для выполнения.

Генератор кода автоматически обрабатывает многие общие функции визуализации MATLAB, такие как функция axis как внешний.

function c = pythagoras(a,b,color) %#codegen
% Calculate the hypotenuse of a right triangle
% and display the triangle as a patch object. 
c = sqrt(a^2 + b^2);
create_plot(a, b, color);
end

function create_plot(a, b, color)
%Declare patch as extrinsic
coder.extrinsic('patch'); 
x = [0;a;a];
y = [0;0;b];
patch(x,y,color);
axis('equal');
end

Создание функции MEX для pythagoras. Кроме того, создайте отчет о создании кода.

codegen -report pythagoras -args {1, 1, [.3 .3 .3]}

В отчете просмотрите код MATLAB для create_plot.

В докладе подчеркивается patch и axis для указания на то, что они рассматриваются как внешние функции.

Запустите функцию MEX.

pythagoras_mex(3, 4, [1.0 0.0 0.0]);

MATLAB отображает график правого треугольника как красный объект-фрагмент.

Примечание

Вместо создания файла MEX с помощью codegen команда, также можно разместить функцию pythagoras внутри функционального блока MATLAB в модели Simulink. При моделировании модели функциональный блок MATLAB имеет поведение, аналогичное pythagoras_mex.

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

Определение функции MATLAB foo который принимает индексы исходного и целевого узлов для направленного графа в качестве входных данных и определяет, является ли граф ациклическим. Функция foo также строит график направления.

Функция foo вызывает следующие функции, которые не поддерживаются для генерации кода:

  • plot: Генератор кода автоматически рассматривает эту функцию как внешнюю.

  • digraph и isdag: Эти две функции явно объявлены как внешние с помощью coder.extrnisic конструкция.

function isDAG = foo(source,target)
coder.extrinsic('digraph','isdag');
assert(numel(source) == numel(target))
G = digraph(source,target);
plot(G)
isDAG = isdag(G);
end

Создание кода MEX для foo. Укажите входные данные как неограниченные векторы типа double.

codegen foo -args {coder.typeof(0,Inf),coder.typeof(0,Inf)}

Вызов сгенерированной функции MEX foo_mex с подходящими входными данными:

foo_mex([1 2 4 4],[2 3 3 1])
ans =

  logical

   1

MATLAB также отображает график:

A directed acyclic graph with four vertices and four edges.

Входные аргументы

свернуть все

Имя функции MATLAB, объявленной как внешняя.

Пример: coder.extrinsic('patch')

Типы данных: char

Ограничения

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

  • Генератор кода не поддерживает использование coder.extrinsic для вызова функций, расположенных в частной папке.

  • Генератор кода не поддерживает использование coder.extrinsic для вызова локальных функций.

Совет

  • Генератор кода автоматически обрабатывает многие общие функции визуализации MATLAB, такие как plot, disp, и figure, как внешний. Нет необходимости явно объявлять их как внешние функции с помощью coder.extrinsic.

  • Используйте coder.screener для определения функций, которые необходимо объявить как внешние. Эта функция запускает инструмент готовности к генерации кода, который просматривает код MATLAB для функций и функций, которые не поддерживаются для генерации кода.

Представлен в R2011a