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

При обработке вызова функционального foo в вашем коде MATLAB® генератор кода находит определение 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 как значение внешних параметров:

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

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

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

Используя coder.extrinsic Создать

Объявить функциональный foo как значение внешних параметров, включайте этот оператор в свой код MATLAB.

coder.extrinsic('foo')

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

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

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

  • Присвойте возвращаемое значение внешней функции к известному типу. Смотрите Работу с mxArrays.

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

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

Если вы генерируете MEX или автономный код C/C++ при помощи MATLAB Coder™, вызовов подсветок отчета генерации кода от вашего кода 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 вызывать локальные функции или функции, которые расположены в частной папке.

Работа с 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 выходными параметрами.

Смотрите также

|