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

Это некоторые распространенные ситуации, в которых можно объявить функцию MATLAB внешней:
Функция выполняет действия отображения или ведения журнала. Такие функции используются главным образом во время моделирования и не используются во встроенных системах.
При выполнении MEX или симуляции Simulink необходимо использовать функцию MATLAB, которая не поддерживается для генерации кода. Этот рабочий процесс не применяется к целям, не относящимся к моделированию.
Вы даете генератору кода команду на постоянное сворачивание вызова функции с помощью coder.const. В таких ситуациях функция вызывается только во время генерации кода, когда механизм MATLAB доступен для выполнения вызова.
coder.extrinsic КонструкцияОбъявление функции foo как внешнее, включите это утверждение в свой код MATLAB.
coder.extrinsic('foo')Объявляя функции как внешние для генерации кода, придерживайтесь следующих правил:
Перед вызовом функции объявите ее внешней.
Не используйте внешнее объявление в условных операторах.
Присвойте возвращаемое значение внешней функции известному типу. См. раздел Работа с mxArrays (кодер MATLAB).
Дополнительные сведения и примеры см. в разделе coder.extrinsic.
Генератор кода автоматически обрабатывает многие общие функции визуализации MATLAB, такие как plot, disp, и figure, как внешний. Нет необходимости явно объявлять их как внешние функции с помощью coder.extrinsic. Например, может потребоваться позвонить plot для визуализации результатов в среде MATLAB. При создании функции MEX из функции, вызывающей plot, а затем запустить сгенерированную функцию MEX, генератор кода отправляет вызовы plot функция для модуля MATLAB. При создании библиотеки или исполняемого файла созданный код не содержит вызовов plot функция.
При создании кода MEX или автономного кода C/C + + с помощью Coder™ MATLAB отчет о создании кода выделяет вызовы из кода MATLAB во внешние функции. Проверяя отчет, можно определить, какие функции поддерживаются только в среде MATLAB.

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.
Вместо использования coder.extrinsic вызовите функцию MATLAB, используя 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
Нестатические методы также известны как обычные методы. См. раздел Определение методов и функций классов.
Используйте coder.extrinsic конструкция для:
Вызовите функции MATLAB, которые не выводят данные во время моделирования без создания ненужного кода.
Сделайте код самодокументированным и более простым в отладке. Можно просканировать исходный код для coder.extrinsic операторы для изоляции вызовов функций MATLAB, которые потенциально могут создавать и распространять mxArrays. См. раздел Работа с mxArrays (кодер MATLAB).
fevalЧтобы ограничить область внешнего объявления одним вызовом функции, используйте функцию 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 для вызова локальных функций или функций, расположенных в частной папке.
Выходом внешней функции является mxArray, также известный как массив MATLAB. Единственные допустимые операции для mxArrays являются:
Хранение mxArray в переменной.
Прохождение mxArray функции.
Возвращение mxArray из функции обратно в MATLAB.
Преобразование mxArray к известному типу во время выполнения. Для выполнения этого действия назначьте mxArray переменной, тип которой уже определен предыдущим назначением. См. пример ниже.
Использование mxArray возвращаемый внешней функцией в других операциях (например, возвращая ее из блока MATLAB Function для выполнения Simulink), необходимо сначала преобразовать ее в известный тип.
Если входными аргументами функции являются 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. Потому что входные данные переданы min являются mxArrays, генератор кода автоматически обрабатывает min как внешняя функция. В результате, min возвращает mxArray.
При создании функции MEX с помощью кодера MATLAB можно непосредственно присвоить эту функцию. mxArray возвращено min в выходные данные y потому что функция MEX возвращает свои выходные данные в MATLAB.
Но если поставить foo в блоке MATLAB Function в модели Simulink с последующим обновлением или запуском модели возникает следующая ошибка:
Function output 'y' cannot be an mxArray in this context. Consider preinitializing the output variable with a known type.
Эта ошибка возникает из-за возврата mxArray возврат к Simulink не поддерживается. Чтобы устранить эту проблему, определите 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
Изменение параметров Simulink
Генератор кода не поддерживает использование coder.extrinsic для вызова функций, расположенных в частной папке.
Генератор кода не поддерживает использование coder.extrinsic для вызова локальных функций.
Можно вызывать внешние функции с 64 входами и 64 выходами.