MATLAB® может запустить MEX-функции C++ в отдельном процессе. Выполнение MEX-функции C++ в отдельном процессе позволяет:
Изолируйте процесс MATLAB от катастрофических отказов в MEX-функции C++.
Пользуйтесь некоторыми сторонними библиотеками в MEX-функции C++, которые не совместимы с MATLAB.
Сохраните память путем выполнения нескольких MEX-функций C++ в одном процессе.
Присоедините отладчики C++ к хост-процессу MEX.
Прервите выполнение MEX-функции C++ с помощью Ctrl+C
Примечание
Размер переменных передал между C++, и MATLAB ограничивается 2 Гбайт, когда вы вызываете функцию C++ из процесса. Этот предел применяется к данным плюс поддержка информации, переданной между процессами.
Выполните эти шаги, чтобы запустить вашу MEX-функцию C++ из процесса:
Запишите свою MEX-функцию C++ и создайте ее с помощью инструкций в Сборке Программы C++ MEX. Нет никаких необходимых различий кода между функциями, записанными для незавершенного и выполнения из процесса.
Создайте хост-процесс MEX с помощью mexhost
функция.
Используйте feval
метод matlab.mex.MexHost
объект, возвращенный mexhost
запускать вашу MEX-функцию C++ в хост-процессе.
При исчерпывании процесса MEX-функции C++ всегда выполняются в той же папке как текущая папка MATLAB. Изменение текущей папки MATLAB после создания объекта хоста MEX приводит к тому же изменению в контексте MEX-функции C++.
arrayProduct
MEX-функция из процессаСледующий пример запускается arrayProduct
MEX-функция C++ из процесса. Исходный код C++ MEX доступен в файле arrayProduct.cpp
. Чтобы использовать этот пример MEX-функция C++, откройте arrayProduct.cpp
исходный файл, сохраните его на своем пути MATLAB и создайте MEX-функцию C++ с помощью инструкций в Сборке Программы C++ MEX.
После создания MEX-функции C++ запустите хост-процесс MEX с помощью mexhost
функция. Эта функция возвращает объект matlab.mex.MexHost
класс.
Используйте feval
метод, чтобы запуститься arrayProduct
MEX-функция C++ в хост-процессе. Передайте имя MEX-функций C++ и аргументы к 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));
Можно запустить другие MEX-функции C++ в том же процессе с помощью того же 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
команда автоматически разгружает MEX-функции C++ прежде, чем восстановить их. Поэтому вы не должны явным образом разгружать MEX-функции C++ от хост-процесса MEX.
Можно явным образом разгрузить все MEX-функции C++ от хост-процесса MEX путем вызова clear
mex
или clear
functions
. Разгрузите определенную MEX-функцию C++ путем вызова clear
на имени функции.
Чтобы предотвратить разгрузку MEX-функции C++, используйте mexLock
функция. Чтобы разблокировать MEX-функцию C++, использовать mexUnlock
. Эти функции набор или сброс флаг для MEX-функции C++ на хост-процессе, чтобы управлять разгрузкой MEX-функций C++.
Используйте matlab.mex.MexHost
объект получить информацию о хост-процессе MEX. Эти свойства предоставляют информацию о процессе и загруженных функциях.
EnvironmentVariables
содержит имена и значения набора переменных окружения для процесса.
Functions
содержит имена всех MEX-функций C++, загруженных в хост-процесс MEX.
ProcessName
содержит имя хост-процесса MEX, который является MATLABMexHost
по умолчанию.
ProcessIdentifier
содержит идентификатор процесса.
Для получения дополнительной информации об этих свойствах смотрите matlab.mex.MexHost
.
В определенных случаях вы можете всегда хотеть запустить свою MEX-функцию C++ из процесса. Например, исчерпывание процесса может быть необходимым, если существуют сторонние конфликты библиотеки между MATLAB и MEX-функцией C++.
Чтобы обеспечить удобный способ запустить MEX-функцию C++ из процесса, создайте функцию MATLAB обертки. Функция обертки создает объект хоста MEX и запускает MEX-функцию C++ в том процессе.
Например, предположите, что вы хотите создать функцию обертки для arrayProduct.cpp
MEX-функция C++, которая включена в документацию как пример. Создайте функцию MATLAB с именем arrayProduct.m
и помещенный этот файл в папку, которая находится на пути MATLAB. Создайте MEX-функцию C++ и присвойте другое имя для скомпилированного файла MEX.
Функция обертки создает matlab.mex.MexHost
объект, который присвоен персистентной переменной так, чтобы процесс не был уничтожен между последующими вызовами функции обертки. Функция использует этот объект вызвать feval
метод для выполнения из процесса MEX-функции C++. Если объект хоста 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
Чтобы создать MEX-функцию C++, откройте arrayProduct.cpp
исходный файл и сохраняет его на вашем пути MATLAB. Создайте MEX-функцию C++ с помощью инструкций в этой теме, Сборка Программы C++ MEX.
Следующая команда создает файл MEX с корневым именем arrayProductMEX
и помещает его в папку с функцией обертки, которая принята, чтобы быть MyPathFolder
в этом примере. mex
команда создает папку, если это не существует.
mex -output arrayProductMEX -outdir MyPathFolder arrayProduct.cpp
Чтобы использовать MEX-функцию C++, вызовите его из командной строки как любая функция через функцию обертки.
result = arrayProduct(2,[1 2 3 4]); result
result = 2 4 6 8
Следующий код вызывает MEX-функцию C++ в a for
цикл. Первый вызов arrayProduct
создает хост-процесс MEX. Последующие вызовы используют тот же процесс, если процесс не уничтожается, например, катастрофический отказ MEX-функции C++.
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++ к MEX-функции C++ и установить точки останова отлаживать программу. Вот шаги, чтобы настроить и отладить MEX-функцию C++ из процесса.
Создайте исходный код C++ MEX с помощью mex
команда с -g
опция, чтобы включать отладочную информацию.
Создайте хост-процесс с помощью mexhost
функция. Эта функция возвращает объект matlab.mex.MexHost
.
Получите идентификатор процесса от matlab.mex.MexHost
объект ProcessIdentifier
свойство.
Используйте идентификатор процесса, чтобы присоединить отладчик C++ к процессу.
Вставьте точки останова в исходный код.
Запустите MEX-функцию C++ из процесса с помощью feval
метод.
Для получения информации об использовании определенных отладчиков см. документацию для тех отладчиков.
Гарантируйте, что Визуальный 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 Debug выберите Attach to Process.
В диалоговом окне Attach to Process выберите MATLABMexHost
процесс, и нажимает Attach.
Visual Studio загружает данные, и затем отображает пустую панель кода.
Откройте свой исходный файл C++ MEX путем нажатия на File> Open> File и выбора файла.
Установите точку останова путем щелчка правой кнопкой по желаемой строке кода и нажатия на Breakpoint> Insert Breakpoint в контекстном меню.
В MATLAB, запуск MEX-функция C++ из процесса с помощью 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
с именем файла MEX C++ и идентификатором процесса, который вы получили из объекта хоста MEX в MATLAB:
gdb myMexFunction -pid=13892
Установите точки останова в MEX-функции C++. Например, использование gdb
, установите точку останова в myMexFunction.cpp
в линии 21:
break myMexFunction.cpp:21
Из MATLAB, запуск MEX-функция C++ из процесса с помощью 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, запуск MEX-функция C++ из процесса с помощью matlab.mex.MexHost
feval
метод.
result = feval(mh'myMexFunction',input1,input2,...)
MATLAB ожидает ответа от отладчика.
Enter
C
или continue
от macOS Терминала. Выполнение программы останавливается в точках останова.
От macOS Терминала используйте функции, обеспеченные отладчиком, чтобы отладить ваш исходный код.