MATLAB® может запустить MEX-функции C++ в отдельном процессе. Выполнение MEX-функции C++ в отдельном процессе позволяет:
Изолируйте процесс MATLAB от катастрофических отказов в MEX-функции C++.
Пользуйтесь некоторыми сторонними библиотеками в MEX-функции C++, которые не совместимы с MATLAB.
Сохраните память путем выполнения нескольких MEX-функций C++ в одном процессе.
Присоедините отладчики C++ к хост-процессу MEX.
Прервите выполнение MEX-функции C++ с помощью Ctrl+C
Выполните эти шаги, чтобы запустить вашу MEX-функцию C++ из процесса:
Запишите свою MEX-функцию C++ и создайте ее с помощью инструкций в Сборке Программы C++ MEX. Нет никаких необходимых различий кода между функциями, записанными для незавершенного и выполнения из процесса.
Создайте хост-процесс MEX с помощью функции mexhost
.
Используйте метод feval
объекта matlab.mex.MexHost
, возвращенного mexhost
, чтобы запустить вашу MEX-функцию C++ в хост-процессе.
При исчерпывании процесса MEX-функции C++ всегда выполняются в той же папке как текущая папка MATLAB. Изменение текущей папки MATLAB после создания объекта хоста MEX приводит к тому же изменению в контексте MEX-функции C++.
Следующий пример запускает MEX-функцию C++ arrayProduct
из процесса. Исходный код C++ MEX доступен в файле arrayProduct.cpp
. Чтобы использовать этот пример MEX-функция C++, откройте исходный файл arrayProduct.cpp
, сохраните его на вашем пути MATLAB и создайте MEX-функцию C++ с помощью инструкций в Сборке Программы C++ MEX.
После создания MEX-функции C++ запустите хост-процесс MEX с помощью функции mexhost
. Эта функция возвращает объект класса matlab.mex.MexHost
.
Используйте метод feval
, чтобы запустить MEX-функцию C++ arrayProduct
в хост-процессе. Передайте имя 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. Эти свойства предоставляют информацию о процессе и загруженных функциях.
Functions
содержит имена всех MEX-функций C++, загруженных в хост-процесс MEX.
ProcessName
содержит имя хост-процесса MEX, который является MATLABMexHost
по умолчанию.
ProcessIdentifier
содержит идентификатор процесса.
Для получения дополнительной информации об этих свойствах смотрите matlab.mex.MexHost
.
В определенных случаях вы можете всегда хотеть запустить свою MEX-функцию C++ из процесса. Например, исчерпывание процесса может быть необходимым, если существуют сторонние конфликты библиотеки между MATLAB и MEX-функцией C++.
Чтобы обеспечить удобный способ запустить MEX-функцию C++ из процесса, создайте функцию MATLAB обертки. Функция обертки создает объект хоста MEX и запускает MEX-функцию C++ в том процессе.
Например, предположите, что вы хотите создать функцию обертки для MEX-функции C++ arrayProduct.cpp
, которая включена в документацию как пример. Создайте функцию 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++ в цикле 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
.
Получите идентификатор процесса от свойства ProcessIdentifier
объекта matlab.mex.MexHost
.
Используйте идентификатор процесса, чтобы присоединить отладчик 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++ из процесса с помощью
метода feval
matlab.mex.MexHost
.
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++ из процесса с помощью
метода feval
matlab.mex.MexHost
.
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++ из процесса с помощью
метода feval
matlab.mex.MexHost
.
result = feval(mh'myMexFunction',input1,input2,...)
MATLAB ожидает ответа от отладчика.
Enter
C
или continue
от macOS Терминала. Выполнение программы останавливается в точках останова.
От macOS Терминала используйте функции, обеспеченные отладчиком, чтобы отладить ваш исходный код.