Используйте MATLAB Engine для выполнения вызова функции в сгенерированном коде

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

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

Включая coder.extrinsic('foo') директива внутри определенной функции MATLAB объявляет все вызовы foo внутри этого функция MATLAB как внешняя. Кроме того, можно хотеть сузить возможности внешнего объявления всего одним вызовом к foo. См. раздел «Вызов функций MATLAB с использованием feval (MATLAB Coder)».

Когда объявлять функцию внешней

Это некоторые распространенные ситуации, в которых вы можете рассмотреть возможность объявления функции MATLAB внешней:

  • Функция выполняет действия отображения или регистрации. Такие функции применяются в основном во время симуляции и не используются во встраиваемых системах.

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

  • Вы предписываете генератору кода постоянно складывать вызов функции при помощи coder.const. В таких ситуациях функция вызывается только во время генерации кода, когда движок MATLAB доступен для выполнения вызова.

Использование coder.extrinsic Конструкция

Объявление функции foo как extinsic, включите этот оператора в код MATLAB.

coder.extrinsic('foo')

При объявлении функций как внешних для генерации кода придерживайтесь следующих правил:

  • Объявите функцию как внешнюю перед вызовом.

  • Не используйте внешнее объявление в условных операторах.

  • Присвойте возврат значение внешней функции известному типу. См. «Работа с mxArrays (MATLAB Coder)».

Для получения дополнительной информации и примеров смотрите coder.extrinsic.

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

Если при помощи MATLAB Coder™ вы генерируете MEX или автономный код C/C + +, в отчете о генерации кода подсвечиваются вызовы из кода MATLAB во внешние функции. При проверке отчета можно определить, какие функции поддерживаются только в среде MATLAB.

Возможности деклараций внешних функций

The 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 как extinsic.

function y = myFunction(x) %#codegen
coder.extrinsic('foo');
obj = myClass;
y = foo(obj,x);
end

Нестатические методы также известны как обычные методы. См. «Определение методов и функций классов».

Дополнительные виды использования

Используйте coder.extrinsic создать к:

  • Вызовите функции MATLAB, которые не выдают выход во время симуляции, не генерируя ненужный код.

  • Сделайте свой код самодокументирующимся и легче отлаживаемым. Можно сканировать исходный код на coder.extrinsic операторы для изоляции вызовов функций MATLAB, которые потенциально могут создавать и распространять mxArrays. См. «Работа с mxArrays (MATLAB Coder)».

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

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

Работа с mxArrays

Выход внешней функции является mxArray, также известный как массив MATLAB. Единственные допустимые операции для mxArrays являются:

  • Хранение mxArray в переменной.

  • Передача mxArray в функцию.

  • Возврат mxArray из функции обратно в MATLAB.

  • Преобразование mxArray к известному типу во время выполнения. Чтобы выполнить это действие, присвойте mxArray переменной, тип которой уже определен предшествующим назначением. См. пример ниже.

Как использовать mxArray возвращенная внешней функцией в других операциях (для примера, возвращая ее из блока MATLAB Function в выполнение Simulink), необходимо сначала преобразовать ее в известный тип.

Если входные параметры функции 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. Потому что входы перешли к min являются mxArraysГенератор кода автоматически обрабатывает min как внешнюю функцию. В результате min возвращает mxArray.

При генерации MEX-функции с помощью MATLAB Coder можно непосредственно назначить эту 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 выходами.

См. также

|