coder.extrinsic

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

Описание

пример

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

Во время генерации автономного кода генератор кода пытается определить, влияет ли внешняя функция на выход функции, в которой она вызывается - например, путем возврата 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).

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

См. «Генерация кода для глобальных данных» (MATLAB Coder).

Примеры

свернуть все

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

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

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

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 Function в модели Simulink. Когда вы моделируете модель, MATLAB Function блок имеет такое же поведение, как 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 функция, чтобы обнаружить, какие функции вы должны объявить внешними. Эта функция запускает Code Generation Readiness Tool, который просматривает код MATLAB для функций и функций, которые не поддерживаются для генерации кода.

Введенный в R2011a