При обработке вызова функционального foo в коде MATLAB® генератор кода находит определение foo и генерирует код для его тела. В некоторых случаях вы можете хотеть обойти генерацию кода и вместо этого использовать движок MATLAB, чтобы выполнить вызов. Используйте coder.extrinsic('foo'), чтобы объявить, что вызовы foo не генерируют код и вместо этого используют движок MATLAB для выполнения. В этом контексте foo упоминается как внешняя функция. Эта функциональность доступна только, когда движок MATLAB доступен в MEX-функциях или во время вызовов coder.const во время компиляции.
Если вы генерируете автономный код для функции, которая вызывает foo и включает coder.extrinsic('foo'), генератор кода пытается определить, влияет ли foo на вывод. Если foo не влияет на вывод, доходы генератора кода с генерацией кода, но исключает foo из сгенерированного кода. В противном случае генератор кода производит ошибку компиляции.
Генератор кода автоматически обрабатывает много общих функций визуализации MATLAB, таких как plot, disp и figure, как внешние. Вы не должны явным образом объявлять их как внешние функции при помощи coder.extrinsic. Например, вы можете хотеть вызвать plot, чтобы визуализировать ваши результаты в среде MATLAB. Если вы генерируете MEX-функцию от функции, которая вызывает plot, и затем запустите сгенерированную MEX-функцию, вызовы отправок генератора кода функции plot к движку MATLAB. Если вы генерируете библиотеку или исполняемый файл, сгенерированный код не содержит вызовы функции plot. Отчет генерации кода подсвечивает вызовы от вашего кода MATLAB до внешних функций так, чтобы было легко определить, какие функции поддерживаются только в среде MATLAB.

Для неподдерживаемых функций кроме общих функций визуализации необходимо объявить, что функции являются внешними (см. Разрешение Вызовов функции для Генерации кода). Внешние функции не компилируются, но вместо этого выполняются в MATLAB во время моделирования (см. Разрешение Внешних Функций Во время Моделирования).
Существует два способа объявить, что функция является внешней:
Используйте построение coder.extrinsic в основных функциях или локальных функциях (см. Объявление функций MATLAB как Внешние Функции).
Вызовите функцию косвенно с помощью feval (см., что функции MATLAB Вызова Используют feval).
Чтобы объявить, что функция MATLAB является внешней, добавьте построение coder.extrinsic во главе основной функции или локальной функции:
coder.extrinsic('function_name_1', ... , 'function_name_n');Следующий код объявляет функцию patch MATLAB, внешнюю в локальной функции create_plot. Вы не должны объявлять axis как внешний, потому что axis является одной из общих функций визуализации, которые генератор кода автоматически обрабатывает как внешний.
function c = pythagoras(a,b,color) %#codegen
% Calculates the hypotenuse of a right triangle
% and displays the triangle.
c = sqrt(a^2 + b^2);
create_plot(a, b, color);
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'); Генератор кода не производит код для patch и axis, но вместо этого отправляет их MATLAB для выполнения.
Чтобы протестировать функцию, выполните эти шаги:
Преобразуйте pythagoras в MEX-функцию путем выполнения этой команды в посдказке MATLAB:
codegen -report pythagoras -args {1, 1, [.3 .3 .3]}Щелкните по ссылке к отчету генерации кода и затем, в отчете, просмотрите код MATLAB для create_plot.
Отчет подсвечивает patch и функции axis, чтобы указать, что они поддержаны только в среде MATLAB.

Запустите MEX-функцию путем выполнения этой команды:
pythagoras_mex(3, 4, [1.0 0.0 0.0]);
MATLAB отображает график прямоугольного треугольника как красный объект закрашенной фигуры:

Используйте построение coder.extrinsic для:
Вызовите функции MATLAB, которые не производят вывод во время моделирования, не генерируя ненужный код (см. Разрешение Внешних Функций Во время Моделирования).
Сделайте свое самодокументирование кода и легче отладить. Можно отсканировать исходный код для операторов coder.extrinsic, чтобы изолировать вызовы функций MATLAB, которые могут потенциально создать и распространить mxArrays (см. Работу с mxArrays).
Сохраните ввод. С одним оператором coder.extrinsic каждый последующий вызов функции является внешним, пока вызов и оператор находятся в том же осциллографе (см. Осциллограф Внешних Объявлений функции).
Объявите функцию (функции) MATLAB, внешнюю всюду по осциллографу функции вызова (см. Осциллограф Внешних Объявлений функции). Чтобы сузить осциллограф, используйте feval (см., что функции MATLAB Вызова Используют feval).
Наблюдайте следующие правила при объявлении функций, внешних для генерации кода:
Объявите функцию, внешнюю, прежде чем вы вызовете ее.
Не используйте внешнее объявление в условных операторах.
Построение coder.extrinsic имеет функциональный осциллограф. Например, рассмотрите следующий код:
function y = foo %#codegen
coder.extrinsic('rat','min');
[N D] = rat(pi);
y = 0;
y = min(N, D);
В этом примере rat и min, столь же обработанном как внешнем каждый раз, они называются в основном функциональном foo. Существует два способа сузить осциллограф внешнего объявления в основной функции:
Объявите функцию MATLAB, внешнюю в локальной функции, как в этом примере:
function y = foo %#codegen
coder.extrinsic('rat');
[N D] = rat(pi);
y = 0;
y = mymin(N, D);
function y = mymin(a,b)
coder.extrinsic('min');
y = min(a,b);
Здесь, функциональный rat является внешним каждый раз, когда он называется в основном функциональном foo, но функциональный min является внешним только, когда названо в локальной функции mymin.
Вызовите функцию MATLAB с помощью feval, как описано в Вызове функций MATLAB Используя feval.
Функциональный feval автоматически интерпретирован как внешняя функция во время генерации кода. Поэтому можно использовать feval, чтобы удобно вызвать функции, которые вы хотите выполнить в среде MATLAB, а не скомпилированный в сгенерированный код.
Рассмотрите следующий пример:
function y = foo
coder.extrinsic('rat');
[N D] = rat(pi);
y = 0;
y = feval('min', N, D);
Поскольку feval является внешним, оператор feval('min', N, D) оценен MATLAB — не скомпилированный — который имеет тот же результат как объявление функционального min, внешнего для просто этого вызова. В отличие от этого, функциональный rat является внешним всюду по функциональному foo.
Генератор кода не поддерживает использование feval, чтобы вызвать локальные функции или функции, которые расположены в частной папке.
Предположим, что вы задаете класс myClass, который имеет нестатический метод foo, и затем создайте экземпляр obj этого класса. Если вы хотите объявить метод obj.foo как внешний в вашем коде MATLAB, который вы предназначаете для генерации кода, следуете этим правилам:
Запишите вызов foo как вызов функции. Не пишите вызов при помощи записи через точку.
Объявите, что foo является внешним при помощи синтаксиса coder.extrinsic('foo').
Например, задайте myClass как:
classdef myClass
properties
prop = 1
end
methods
function y = foo(obj,x)
y = obj.prop + x;
end
end
end
Вот функция MATLAB в качестве примера, которая объявляет foo как внешний.
function y = myFunction(x) %#codegen
coder.extrinsic('foo');
obj = myClass;
y = foo(obj,x);
end
Нестатические методы также известны как обычные методы. См. Методы и Функции (MATLAB).
Генератор кода разрешает вызовы внешних функций — функции, которые не поддерживают генерацию кода — можно следующим образом:

Во время моделирования генератор кода производит код для вызова внешней функции, но не генерирует внутренний код для функции. Поэтому можно запустить моделирование только на платформах, где вы устанавливаете программное обеспечение MATLAB.
Во время генерации кода генератор кода пытается определить, влияет ли внешняя функция на вывод функции, в которой это называется — например, путем возврата mxArrays выходной переменной (см. Работу с mxArrays). При условии, что вывод не изменяется, доходы генерации кода, но внешняя функция исключена из сгенерированного кода. В противном случае генератор кода выпускает ошибку компилятора.
Выводом внешней функции является mxArray — также вызвал массив MATLAB. Единственные допустимые операции для mxArrays:
Хранение mxArrays в переменных
Передача mxArrays к функциям и возврату их от функций
Преобразование mxArrays к известным типам во время выполнения
Чтобы использовать mxArrays, возвращенный внешними функциями в других операциях, необходимо сначала преобразовать их в известные типы, как описано в Преобразовании mxArrays к Известным Типам.
Чтобы преобразовать mxArray в известный тип, присвойте mxArray переменной, тип которой задан. Во время выполнения mxArray преобразован в тип переменной, присвоенной ему. Однако, если данные в mxArray не сопоставимы с типом переменной, вы получаете ошибку времени выполнения.
Например, рассмотрите этот код:
function y = foo %#codegen
coder.extrinsic('rat');
[N D] = rat(pi);
y = min(N, D);
Здесь, функциональный foo верхнего уровня вызывает внешнюю функцию MATLAB rat, который возвращает два mxArrays, представляющий числитель N и знаменатель D рационального дробного приближения pi. Несмотря на то, что можно передать их mxArrays другой функции MATLAB — в этом случае, min — вы не можете присвоить mxArray, возвращенный min в вывод y.
Если при запуске этот функциональный foo в блоке MATLAB function в модели Simulink®, код генерирует следующую ошибку во время моделирования:
Function output 'y' cannot be of MATLAB type.
Чтобы решить эту проблему, задайте y, чтобы быть типом и размером значения, которое вы ожидаете, что min возвратит — в этом случае, скаляр дважды — можно следующим образом:
function y = foo %#codegen
coder.extrinsic('rat');
[N D] = rat(pi);
y = 0; % Define y as a scalar of type double
y = min(N,D);Полная среда выполнения MATLAB не поддержана во время генерации кода. Поэтому следующие ограничения применяются при вызове функций MATLAB внешне:
Функции MATLAB, которые осматривают вызывающую сторону, или читают или пишут в рабочую область вызывающей стороны, не работают во время генерации кода. Такие функции включают:
Отладчик MATLAB не может осмотреть переменные, заданные во внешних функциях.
Функции в сгенерированном коде могут привести к непредсказуемым результатам, если ваша внешняя функция выполняет следующие действия во время выполнения:
Измените папки
Измените путь MATLAB
Удалите или добавьте файлы MATLAB
Измените предупреждение состояний
Измените настройки MATLAB
Измените параметры Simulink
Генератор кода не поддерживает использование coder.extrinsic, чтобы вызвать функции, которые расположены в частной папке.
Генератор кода не поддерживает использование coder.extrinsic, чтобы вызвать локальные функции.
Можно вызвать функции максимум с 64 входными параметрами и 64 выходными параметрами.