MATLAB ® может выполнять функции C++ MEX в отдельном процессе. Выполнение функции C++ MEX в отдельном процессе позволяет:
Изолировать процесс MATLAB от сбоев в функции C++ MEX.
Используйте некоторые сторонние библиотеки в функции C++ MEX, которые несовместимы с MATLAB.
Экономьте память, выполняя несколько функций C++ MEX в одном процессе.
Подключите отладчики C++ к процессу хоста MEX.
Прервать выполнение функции C++ MEX с помощью Ctrl + C
Примечание
Размер переменных, передаваемых между C++ и MATLAB, ограничен 2 ГБ при вызове функции C++ вне процесса. Этот предел применяется к данным плюс вспомогательная информация, передаваемая между процессами.
Выполните следующие действия, чтобы запустить функцию C++ MEX вне процесса:
Напишите свою функцию C++ MEX и создайте ее с помощью инструкций в программе Build C++ MEX Programs. Между функциями, написанными для выполнения в процессе и вне процесса, нет требуемых кодовых различий.
Создайте хост-процесс MEX с помощью mexhost функция.
Используйте feval способ matlab.mex.MexHost объект, возвращенный mexhost для запуска функции C++ MEX в хост-процессе.
При завершении процесса функции C++ MEX всегда выполняются в той же папке, что и текущая папка MATLAB. Изменение текущей папки MATLAB после создания объекта-хоста MEX приводит к такому же изменению в контексте функции C++ MEX.
arrayProduct Функция MEX находится вне процессаВ следующем примере запускается arrayProduct Функция C++ MEX вне процесса. Исходный код C++ MEX доступен в файле arrayProduct.cpp. Для использования этого примера функции C++ MEX откройте arrayProduct.cpp исходный файл, сохраните его в пути MATLAB и создайте функцию C++ MEX с помощью инструкций в программе Build C++ MEX Programs.
После создания функции C++ MEX запустите хост-процесс MEX с помощью mexhost функция. Эта функция возвращает объект matlab.mex.MexHost класс.
Используйте feval метод для запуска arrayProduct Функция C++ MEX в хост-процессе. Передайте имя и аргументы функций C++ MEX feval. Возврат результатов в MATLAB путем назначения выходных данных feval.
mh = mexhost;
result = feval(mh,'arrayProduct',2,[1 2 3 4])result =
2 4 6 8 Управляемый arrayProduct в другом хост-процессе MEX. Сначала создайте хост-процесс MEX путем вызова mexhost снова и назначение выходных данных другой переменной. Затем позвоните feval на новом хосте.
mh2 = mexhost;
result2 = feval(mh2,'arrayProduct',2,rand(1,10));В этом же процессе можно запустить другие функции C++ MEX. matlab.mex.MexHost объект, возвращенный mexhost.
result2 = feval(mh2,'anotherMexFunction',inputs);Жизненный цикл хост-процесса MEX связан с жизненным циклом matlab.mex.MexHost объект, возвращенный mexhost. Как и любой объект-дескриптор, MATLAB вызывает delete когда на объект больше нет ссылок. При вызове MATLAB delete или если вы звоните delete на объекте явно, MATLAB завершает процесс, связанный с MexHost объект.
Вы можете завершить процесс явным образом, вызвав clear с любой из следующих опций:
clear переменная, возвращенная mexhost функция
clear
classes, clear
java, или clear
all
mex команда автоматически выгружает функции C++ MEX перед их перестроением. Поэтому нет необходимости явно выгружать функции C++ MEX из хост-процесса MEX.
Можно явно выгрузить все функции C++ MEX из хост-процесса MEX путем вызова clear
mex или clear
functions. Выгрузить определенную функцию C++ MEX путем вызова clear в имени функции.
Для предотвращения выгрузки функции C++ MEX используйте mexLock функция. Для разблокировки функции C++ MEX используйте mexUnlock. Эти функции устанавливают или отменяют флаг для функции C++ MEX в хост-процессе для управления разгрузкой функций C++ MEX.
Используйте matlab.mex.MexHost объект для получения информации о процессе хоста MEX. Эти свойства предоставляют информацию о процессе и загруженных функциях.
EnvironmentVariables содержит имена и значения переменных среды, заданных для процесса.
Functions содержит имена всех функций C++ MEX, загруженных в хост-процесс MEX.
ProcessName содержит имя хост-процесса MEX, которое MATLABMexHost по умолчанию.
ProcessIdentifier содержит идентификатор процесса.
Дополнительные сведения об этих свойствах см. в разделе matlab.mex.MexHost.
В некоторых случаях может потребоваться выполнение функции C++ MEX вне процесса. Например, завершение процесса может потребоваться при наличии конфликтов библиотек сторонних производителей между MATLAB и функцией C++ MEX.
Чтобы обеспечить удобный способ запуска функции C++ MEX вне процесса, создайте обертку функции MATLAB. Функция оболочки создает объект-хост MEX и запускает функцию C++ MEX в этом процессе.
Например, предположим, что необходимо создать функцию-оболочку для arrayProduct.cpp Функция C++ MEX, включенная в документацию в качестве примера. Создание функции MATLAB с именем arrayProduct.m и поместите этот файл в папку, расположенную по пути MATLAB. Создайте функцию C++ MEX и назначьте другое имя для скомпилированного файла MEX.
Функция оболочки создает matlab.mex.MexHost объект, назначенный постоянной переменной, чтобы процесс не разрушался между последующими вызовами функции-оболочки. Функция использует этот объект для вызова feval способ внепроцессного выполнения функции C++ MEX. Если объект хоста MEX недействителен, то функция создает процесс хоста MEX.
function result = arrayProduct(scalefactor,inputarray) persistent mh if ~(isa(mh,'matlab.mex.MexHost') && isvalid(mh)) mh = mexhost; end result = feval(mh,"arrayProductMEX",scalefactor,inputarray); end
Чтобы создать функцию C++ MEX, откройте arrayProduct.cpp исходный файл и сохраните его по пути MATLAB. Создайте функцию C++ MEX, используя инструкции в этом разделе, Сборка программ C++ MEX.
Следующая команда создает файл MEX с именем root arrayProductMEX и помещает его в папку с функцией оболочки, которая считается MyPathFolder в этом примере. mex создает папку, если она не существует.
mex -output arrayProductMEX -outdir MyPathFolder arrayProduct.cpp
Для использования функции C++ MEX вызовите ее из командной строки, как и любую функцию, через функцию-оболочку.
result = arrayProduct(2,[1 2 3 4]); result
result =
2 4 6 8Следующий код вызывает функцию C++ MEX в for цикл. Первый вызов arrayProduct создает хост-процесс MEX. Последующие вызовы используют тот же процесс, если только процесс не будет разрушен, например, сбоем функции C++ MEX.
for k = 1:5 results(k,:) = arrayProduct(k,[1 2 3 4]); end results
results =
1 2 3 4
2 4 6 8
3 6 9 12
4 8 12 16
5 10 15 20Чтобы уничтожить хост-процесс MEX, очистите все функции, определяющие переменную хост-процесса MEX (mh в этом примере) как постоянный. В этом примере снимите флажок arrayProduct.m функция.
clear arrayProduct.mЗапрос clear
functions вызывает разрушение matlab.mex.MexHost объект, который хранится в постоянной переменной и, следовательно, завершает хост-процесс MEX.
Отладчик C++ можно подключить к функции C++ MEX и установить точки останова для отладки программы. Ниже приведены шаги по настройке и отладке функции C++ MEX вне процесса.
Построить исходный код C++ MEX с помощью mex с помощью команды -g для включения символов отладки.
Создайте хост-процесс с помощью mexhost функция. Эта функция возвращает объект matlab.mex.MexHost.
Получение идентификатора процесса из matlab.mex.MexHost объект ProcessIdentifier собственность.
Используйте идентификатор процесса для присоединения отладчика C++ к процессу.
Вставьте точки останова в исходный код.
Запустите функцию C++ MEX вне процесса с помощью feval способ.
Сведения об использовании определенных отладчиков см. в документации по этим отладчикам.
Убедитесь, что Visual Studio ® является выбранным компилятором C++. В этом примере используется Microsoft ® Visual Studio 2015.
cpp = mex.getCompilerConfigurations('C++','Selected'); cpp.Name
ans =
'Microsoft Visual C++ 2015'Создайте исходный код C++ MEX с помощью mex с помощью команды -g вариант. В этом примере предполагается, что исходный файл C++ MEX имеет имя myMexFunction.cpp.
mex -g myMexFunction.cpp
Создайте хост-процесс MEX и верните MexHost объект.
mh = mexhost;
Запустите Visual Studio. Не выходите из сеанса MATLAB.
В меню «Отладка Visual Studio» выберите «Присоединить к процессу».
В диалоговом окне «Присоединение к процессу» выберите MATLABMexHost и нажмите кнопку «Присоединить».
Visual Studio загружает данные, а затем отображает пустую панель кода.
Откройте исходный файл C++ MEX, щелкнув Файл > Открыть > Файл и выбрав файл.
Задайте точку останова, щелкнув правой кнопкой мыши нужную строку кода и выбрав в контекстном меню пункт «Точка останова» > «Вставить точку останова».
В MATLAB запустите функцию C++ MEX вне процесса с помощью matlab.mex.MexHost
feval способ.
result = feval(mh,'myMexFunction',input1,input2,...)
Используйте функции отладчика для отладки исходного кода.
В системах Linux ® можно использовать отладчик, например GNU
®gdb отладчик. Выполните следующие действия для использования gdb отладчик.
Создайте исходный код C++ MEX с помощью mex с помощью команды -g вариант. В этом примере предполагается, что исходный файл C++ MEX имеет имя myMexFunction.cpp.
mex -g myMexFunction.cpp
Создайте хост-процесс MEX и верните MexHost объект.
mh = mexhost;
Получение идентификатора процесса из ProcessIdentifier имущества MexHost объект. Возвращаемое значение представляет собой строку, представляющую идентификатор процесса хоста MEX. Например,
mh.ProcessIdentifier
ans =
"13892"Идентификатор процесса отличается для каждого созданного процесса.
Подключите отладчик к хост-процессу MEX с терминала Linux. Например, использование GNU gdb отладчик, вызов gdb с именем файла C++ MEX и идентификатором процесса, полученным из объекта хоста MEX в MATLAB:
gdb myMexFunction -pid=13892
Установите точки разрыва в функции C++ MEX. Например, использование gdb, установите точку разрыва в myMexFunction.cpp в строке 21:
break myMexFunction.cpp:21
В MATLAB запустите функцию C++ MEX вне процесса с помощью matlab.mex.MexHost
feval способ.
result = feval(mh,'myMexFunction',input1,input2,...)
MATLAB ожидает ответа от отладчика.
С терминала Linux используйте функции отладчика для отладки исходного кода.
В системах Macintosh используйте отладчик LLDB.
Создайте исходный код C++ MEX с помощью mex с помощью команды -g вариант. В этом примере предполагается, что исходный файл C++ MEX имеет имя myMexFunction.cpp.
mex -g myMexFunction.cpp
Создайте хост-процесс MEX и верните MexHost объект.
mh = mexhost;
Получение идентификатора процесса из ProcessIdentifier имущества MexHost объект. Возвращаемое значение представляет собой строку, представляющую идентификатор процесса хоста MEX.
mh.ProcessIdentifier
ans =
"13892"Идентификатор процесса отличается для каждого созданного процесса.
Подключите отладчик к хост-процессу MEX с терминала macOS. Звонить lldb с идентификатором процесса хоста MEX, полученным из объекта хоста MEX в MATLAB. Например, предполагается, что идентификатором процесса является 13892, подключите отладчик LLDB к этому процессу:
lldb -p 13892
Задайте точки разрыва в исходном коде. Например, эта команда задает точку разрыва в myMexFunction.cpp на строке № 21.
breakpoint set -f myMexFunction.cpp -l 21
В MATLAB запустите функцию C++ MEX вне процесса с помощью matlab.mex.MexHost
feval способ.
result = feval(mh'myMexFunction',input1,input2,...)
MATLAB ожидает ответа от отладчика.
Войти
C или continue с терминала macOS. Выполнение программы останавливается в точках останова.
С терминала macOS используйте функции отладчика для отладки исходного кода.